#include <iostream>
using namespace std;
#include <stdlib.h>
#include <stdio.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define STACK_SIZE 100//初始化分配存储空间
#define STACKINCREMENT 5//存储空间增量
typedef int SElemType;
typedef struct SqStack{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack (SqStack *S)//char
{
S->base = (SElemType *)malloc(STACK_SIZE*sizeof(SElemType));
if(!S->base) exit(OVERFLOW);
S->top = S->base;
S->stacksize = STACK_SIZE;
return OK;
}//构造一个空栈
int GetTop(SqStack *S)
{
if(S->top == S->base) return ERROR;
return *(S->top-1);
}//返回栈顶元素
int Push(SqStack *S,SElemType e)//插入e为栈顶元素
{
if(S->top - S->base >= S->stacksize){
S->base = (SElemType *)realloc(S->base,
(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S->base) exit(OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return OK;
}
int Pop(SqStack *S,SElemType *e)
{
if(S->top == S->base) return ERROR;
*e = *--S->top;
return OK;
}
char Precede(char x,char y)//判断优先级,x为栈内,y为栈外
{
if((x=='('&&y==')') || (x=='\n'&&y=='\n'))
return '=';
else if((y=='\n'&&x=='(') || (y==')'&&x=='\n') || (y=='('&&x==')'))
return ERROR;
else if(((y=='+'||y=='-')&&x!='('&&x!='\n') ||
((y=='*'||y=='/')&&x!='-'&&x!='('&&x!='\n'&&x!='+') ||
y==')' || y=='\n')
return '>';
else return '<';
}//判断优先级函数
int In(char c)
{
if (c=='+' || c=='-' ||
c=='*' || c=='/' ||
c=='(' || c==')' || c=='\n')
return OK;
else return ERROR;
}
int Operate(int a,char theta,int b)//计算基本表达式
{
if (theta=='+')
return a+b;
if (theta=='-')
return a-b;
if (theta=='*')
return a*b;
if (theta=='/')
return a/b;
return ERROR;
}
int EvaluateExpression()
{
SqStack OPTR;//用以寄存运算符
SqStack OPND;//用以寄存操作数
InitStack(&OPTR); Push(&OPTR,'\n');
InitStack(&OPND);
int theta;
int c;
int x;//实际没用,只是为了调用pop函数
int y,a,b;
int flag = 0;
c = getchar();
while (c!='\n' || GetTop(&OPTR)!='\n'){
if(!In(c)) {
if (flag == 0){
Push(&OPND,c-48);//输入整数的时候转换
c = getchar();//不是运算符则进栈
flag++;
}
else {
Pop(&OPND,&y);
y = y*10+int(c-48);
Push(&OPND,y);
c = getchar();
}
}//if
else{
flag = 0;
switch(Precede(GetTop(&OPTR),c)){
case '<'://栈顶元素优先权低于栈外元素优先权
Push(&OPTR,c);
c = getchar();
break;
case '='://脱括号处理
Pop(&OPTR,&x);//只是为了除去括号
c = getchar();
break;
case '>'://退栈并且把运算结果入栈
Pop(&OPTR,&theta);
Pop(&OPND,&b);Pop(&OPND,&a);
Push(&OPND,Operate(a,theta,b));
break;
}//switch
}//else
}//while
return GetTop(&OPND);
}
int main()
{
char ch = 'Y';
while(ch != 'N'){
cout<<"Please input the expression:"<<endl;
int answer = EvaluateExpression();
cout<<"The answer is: "<<answer<<endl;
cout<<"Would you want answer espression 'Y' or 'N'"<<endl;
ch = getchar();
getchar();
}
getchar();
return 0;
}
代码仅供参考,不可以进行浮点数的运算,不支持单目运算,包括整数的+-*/运算。
运行时输入表达式回车即可