#include <iostream> #include <ctype.h> #include <cstdio> #include <cstdlib> using namespace std; #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType * base; ElemType * top; int stackSize; }sqStack; void InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //申请一个足够长的栈 if( !s->base ) exit(0); s->top = s->base; s->stackSize = STACK_INIT_SIZE; //赋值栈的长度 } void Push(sqStack *s, ElemType e) { if( s->top - s->base >= s->stackSize ) //判断是否溢出 { s->base = (ElemType *)realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType)); if( !s->base ) exit(0); s->top = s->base + s->stackSize; s->stackSize = s->stackSize + STACKINCREMENT; } *(s->top) = e; s->top++; } void Pop(sqStack *s, ElemType *e) { if(s->top == s->base) //判断是否为空 return ; *e = *--(s->top); } int StackLen(sqStack s) { return (s.top - s.base); //栈的长度 } /** * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * 以上是栈的信息 */ int main() { sqStack s; char c; double d, e; char str[MAXBUFFER]; int i = 0 ; InitStack( &s ); //新建一个栈 printf("请按逆波兰式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志:\n"); scanf("%c", &c); while( c != '#') //输入数字,遇到 # 结束 { while( isdigit(c) || c=='.') //判断输入的是数字或小数点 { str[i++] = c; //记录这个数字 str[i] = '\0'; //数字后面结尾 if( i >= 10 ) //精确度 10 { printf("出错:输入的单个数据过大!\n"); } scanf("%c", &c); if( c == ' ') //如果遇到空格 说明是下一个数 { d = atof(str); Push(&s , d); i = 0 ; break; } } switch(c) //判断c是什么运算符号 { case '+': Pop( &s, &e); Pop( &s, &d); Push( &s, d+e); break; case '-': Pop( &s, &e); Pop( &s, &d); Push( &s, d-e); break; case '*': Pop( &s, &e); Pop( &s, &d); Push( &s, d*e); break; case '/': Pop( &s, &e); Pop( &s, &d); if( e != 0 ) { Push( &s, d/e); } else { printf("\n出错:除数为零!\n"); return -1; } } scanf("%c", &c); } Pop( &s, &d); printf("\n最终计算结果为:%f\n", d); return 0; }
