表达式求值

来源:互联网 发布:星野娜美 知乎 编辑:程序博客网 时间:2024/06/07 04:41
utili.h#ifndef _UTILI_H#define _UTILI_H#include<iostream>using namespace std;#include<stdlib.h>#endif


stack.h#ifndef _STACK_H#define _STACK_H#include"utili.h"#define STACK_INCREMENT 2template<class Type>class Stack{public:Stack(size_t sz = STACK_DEFAULT_SIZE){capacity = sz > STACK_DEFAULT_SIZE ? sz : STACK_DEFAULT_SIZE;base = new Type[capacity];top = 0;}~Stack(){delete []base;base = NULL;capacity = top = 0;}public:void push(const Type &x);bool pop();   void show_stack();Type GetTop();void clear_stack();bool Is_Full();bool Is_Empty();private: enum{STACK_DEFAULT_SIZE = 8};Type *base;size_tcapacity;size_ttop;};////////template<class Type>void Stack<Type>::push(const Type &x){if(Is_Full() == true){base = (Type*)realloc(base,(capacity+STACK_INCREMENT) * sizeof(Type));if(!base)exit(1);//存储分配失败capacity += STACK_INCREMENT;}base[top++] = x;}template<class Type>void Stack<Type>::show_stack(){int i = top;while(i > 0){cout<<base[i-1]<<endl;--i;}}template<class Type>bool Stack<Type>::pop(){if(Is_Empty() == true)return false;top--;return true;}template<class Type>Type Stack<Type>::GetTop(){if(this->Is_Full() == true)return 0;return base[top-1];}template<class Type>void Stack<Type>::clear_stack(){top = 0;}template<class Type>bool Stack<Type>::Is_Empty(){if(top == 0)return true;elsereturn false;}template<class Type>bool Stack<Type>::Is_Full(){if(top == capacity + 1)return true;elsereturn false;}//////////////////////////////#endif
main.cpp#include"stack.h"bool In(char c){//判断c是否为7种运算符之一switch(c){case '+':case '-':case '*':case '/':case '(':case ')':case '#':return true;default:return false;}}char Precede(char t1,char t2){char f;switch(t2){case '+':case '-':if(t1 == '(' || t1 == '#')f = '<';//t1<t2elsef = '>';//t1>t2break;case '*':case '/':if(t1 == '*' || t1 == '/' || t1 == ')')f = '>';//t1>t2elsef = '<';//t1<t2break;case '(':if(t1 == ')'){cout<<"括号不匹配"<<endl;exit(1);}elsef = '<';//t1<t2break;case ')':switch(t1){case '(':f = '=';//t1 = t2break;case '#':cout<<"缺乏左括号"<<endl;exit(1);default:f = '>';//t1 > t2}break;case '#':switch(t1){case '#':f = '=';//t1 = t2case '(':cout<<"缺乏右括号"<<endl;exit(1);default:f = '>';//t1 > t2}break;}return f;}char Operate(int a,char theta,int b){switch(theta){case '+':returna + b;case '-':return  a - b;case '*':return  a * b;}return a/b;}int EvaluateExpression(){//算术表达式求值的算符有限算法,设OPTR和OPND分别为运算符栈和运算数栈Stack<char> OPTR;Stack<int> OPND;int a,b,s;char c,x;OPTR.push('#');//将换行符压入运算符栈OPTR的栈底cin>>c;//由键盘读入1个字符到cx = OPTR.GetTop();//将运算符OPTR的栈顶元素赋给xwhile(c != '#' || x != '#')//c和x不都是换行符{if(In(c))//c是7种运算符之一switch(Precede(x,c))//判断x和c的优先级{case '<':OPTR.push(c);//栈顶元素x的优先级低,入栈cin>>c;//由键盘读入下一个字符到cbreak;case '=':OPTR.pop();//x='('且c=')'情况,弹出栈顶元素cin>>c;//由键盘读入下一个字符到cbreak;case '>':x = OPTR.GetTop();OPTR.pop();//栈顶元素x的优先级高,弹出运算符顶的元素给xb = OPND.GetTop();OPND.pop();a = OPND.GetTop();OPND.pop();//依次将OPND的栈顶元素给弹出来,分别给b,a.OPND.push(Operate(a,x,b));//做运算a x b,并将运算结果如运算符栈}else if(c >= '0' && c <= '9')//c是操作数{OPND.push(c-48);//将该操作数的值cin>>c;//由键盘读入下一个字符到c}else//c是非法字符{cout<<"出现非法字符"<<endl;exit(1);}x = OPTR.GetTop();//将运算符栈的栈顶元素赋给x}s = OPND.GetTop();OPND.pop();//将运算数栈的栈顶元素给x 并且弹出来.if(!OPND.Is_Empty())//如果运算数栈OPND不空{cout<<"表达式不正确"<<endl;exit(1);}return s;}int main(){cout<<"请输入算术表达式(输入的值要在0和9之间):"<<endl;cout<<EvaluateExpression()<<endl;return 0;}



0 0
原创粉丝点击