实现表达式求值(c++实现)

来源:互联网 发布:mac pro测评 编辑:程序博客网 时间:2024/06/05 04:26

这是任意表达式求解的实现,只限于四则运算。

////表达式求解所使用栈的实现部分////#ifndef _STACK_H#define _STACK_H#include<iostream>using namespace std;#define INIT_STACK_SIZE 20#define ElemType inttypedef struct{ElemType *base;int capacity;int top;}Stack;void InitStack(Stack *st);void Push(Stack *st, ElemType x);void ShowStack(Stack *st);void Pop(Stack *st);void Pop(Stack *st,ElemType *v);ElemType GetTop(Stack *st);void ClearStack(Stack *st);bool IsFull(Stack *st){return st->top >= st->capacity;}bool IsEmpty(Stack *st){return st->top == 0;}void InitStack(Stack *st){st->base = (ElemType *)malloc(sizeof(ElemType) * INIT_STACK_SIZE);st->capacity = INIT_STACK_SIZE;st->top = 0;}void Push(Stack *st, ElemType x){if(!IsFull(st)){st->base[st->top++] = x;}else{cout<<"栈满,不能入栈!"<<endl;}}void ShowStack(Stack *st){for(int i=st->top-1; i>=0; --i){cout<<st->base[i]<<endl;}}void Pop(Stack *st){if(!IsEmpty(st)){st->top--;}else{cout<<"栈空,不能出栈!"<<endl;}}void Pop(Stack *st,ElemType *v){if(!IsEmpty(st)){*v = st->base[--st->top];}else{cout<<"栈空,不能出栈!"<<endl;}}ElemType GetTop(Stack *st){if(!IsEmpty(st)){return st->base[st->top-1];}else{cout<<"栈空,不能获取栈顶元素!"<<endl;return -1;}}void ClearStack(Stack *st){st->top = 0;}#endif

//////表达式求解实现部分////#include<iostream>#include"../Test12_30DS/Stack/Stack.h"  //是我的栈实现的头文件,可以根据自己的实际情况来改写using namespace std;#include<string.h>bool IsOper(char ch)     //判断是否是符号{if(ch=='[' || ch=='(' || ch=='+' || ch=='-'||ch=='*' || ch== '/' || ch==']' || ch==')' || ch=='#')return true;elsereturn false;}                  //内      外char Compare(char in, char out)  // 比较栈顶的符号和站外的优先级大小{if(in == '+' || in == '-'){if(out=='+' || out=='-' || out==')' || out=='#')return '>';elsereturn '<';}else if(in == '*' || in == '/'){if(out == '(')return '<';else return '>';}else if(in == '('){if(out == ')')return '=';else return '<';}else if(in == ')'){return '>';}else{if(out == '#')return '=';else return '<';}}//           左值  操作符  右值int Evaluate(int a,int op,int b)  //进行两数的运算{if(op == '+')return a+b;else if(op == '-')return a-b;else if(op == '*')return a*b;elsereturn a/b;}int EvaluateExpression(char *exp){Stack OPO,OPD;int a,b;int op;InitStack(&OPO);InitStack(&OPD);Push(&OPO,'#');while(*exp!='#' || GetTop(&OPO)!='#'){if(IsOper(*exp)){switch(Compare(GetTop(&OPO), *exp)){case '>':Pop(&OPD,&b);Pop(&OPD,&a);Pop(&OPO,&op);Push(&OPD,Evaluate(a,op,b));break;case '<':Push(&OPO,*exp);exp++;break;case '=':Pop(&OPO);exp++;break;default:break;}}else{            int s=0;while(!IsOper(*exp))   //将数字符转化成数字{s=s*10+*exp-'0';exp++;}Push(&OPD,s);        //数字符入栈     }}return GetTop(&OPD);      // 最后的结果}void main(){char exp[30]; cout<<"请输入表达式:> ";cin>>exp;strcat(exp,"#");int result = EvaluateExpression(exp);cout<<"表达式结果为:> "<<result<<endl;}


                                             
0 0