利用堆栈求后缀表达式的值,运算数为实数。实数获取和堆栈问题

牧牧牧牧牧 2017-07-13 10:40:30
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdbool.h>
#include<string.h>

#define MAXOP 100
#define INFINITY 1e9
#define ERROR -1e9
typedef double ElementType; /*堆栈元素类型*/
/*类型依次为运算数、运算符、和结尾*/
typedef enum {
num, opr, end
} Type;

//堆栈的定义
typedef int Position;
typedef struct SNode * PtrToSNode;
struct SNode{
ElementType * Data;
Position Top;
int MaxSize;
};
typedef PtrToSNode Stack;


Stack CreateStack( int MaxSize )
{
Stack S = ( Stack ) malloc( sizeof( struct SNode ) );
S->Data = ( ElementType* ) malloc ( MaxSize * sizeof ( ElementType ) );
S->Top = -1;
S->MaxSize = MaxSize;
return S;
}


bool IsFull( Stack S )
{
return( S->Top == S->MaxSize - 1 );
}


bool Push( Stack S, ElementType X )
{
if( IsFull(S) ){
printf(" 堆栈满 ");
return false;
}
else{
S->Data[++(S->Top)] = X;
return true;
}
}


bool IsEmpty( Stack S )
{
if(S->Top == -1)
return true ;
else
return false;
}


ElementType Pop( Stack S )
{
if( IsEmpty ){
printf( " 堆栈空 " );
return ERROR;
}
else
return (S->Data[ (S->Top)-- ]);
}

//读取Expr字符串内的对象保存到字符串str中
Type GetOp( char *Expr, int * start, char * str )
{
int i = 0;
while(Expr[ (*start) ] == ' ' )
str[0] = Expr[ (*start)++ ];
// printf( "%d", *start );

while( str[i] != ' ' && str[i] != '\0' )
str[++i] = Expr[ (*start)++ ];

if( str[i] == '\0' )
(*start)--;
str[i] = '\0';
// printf( "%d", *start );
if( i == 0 )
return end;
else if( isdigit( str[0] ) || isdigit( str[1] ) )
return num;
else
return opr;
}

//总体程序运算过程
ElementType PostfixExp( char * Expr )
{
Stack S;
Type T;
ElementType Op1, Op2;
char str[MAXOP];
int start = 0;

S = CreateStack( MAXOP );

Op1 = Op2 = 0;
while(( T = GetOp(Expr, &start, str) ) != end){

if( T == num ){
Push( S, atof( str ) );
puts(str);
printf( "%.4f\n", atof( str ));
printf( "%.4f\n", S->Data );
printf("%d\n", S->Top);
}
else{
if(!IsEmpty(S))
Op2 = Pop(S);
else
Op2 = INFINITY;
if(!IsEmpty(S))
Op1 = Pop(S);
else
Op2 = INFINITY;
switch(str[0]){
case'+': Push( S, Op1 + Op2 ); break;
case'-': Push( S, Op1 - Op2 ); break;
case'*': Push( S, Op1 * Op2 ); break;
case'/':
if( Op2 != 0.0 )
Push( S, Op1 / Op2 );
else{
printf( "错误:分母为零\n" );
Op2 = INFINITY;
}
break;
default:
printf( "错误:未知运算符\n" );
Op2 = INFINITY;
break;
}
if(Op2 >= INFINITY)
break;
}
}
if( Op2 < INFINITY )
if(!IsEmpty(S))
Op2 = Pop(S);
else
Op2 = INFINITY;
free(S);
return Op2;
}
//主函数
int main(void)
{
int i, j;
char Expr[MAXOP];
ElementType f;
gets( Expr );
// j = strlen(Expr);
// for( i = 0; i < j; i++ )
// printf( "%.4c\n", Expr[i] );
f = PostfixExp(Expr);
if(f < INFINITY)
printf( "%.4f\n", f );
else
printf( "表达式错误\n" );

return 0;
}


程序主体是照搬陈越、何钦铭数据结构第二版第三章
错误就如图中所看到的一样,读取不到正确的数,堆栈判断也存在问题。自己琢磨了半天还是搞不明白。
...全文
186 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧