括号计算器

//这计算器支持括号功能,格式例子3+(3*3)## ,后面打两个#算结束,还有阶乘和次方等功能留给同学们自己完善
#include <iostream> using namespace std; template<typename T> struct Node {//这个是数据结构模板,char和int都可以用 T data; Node<T>* next; }; template<typename T> class stack { Node<T>* top; public: stack():top(NULL){} void push(T n); T pop(); bool stackEmpty(); T getTop(); ~stack(){} void print(); }; template<typename T> void stack<T>::push(T n) { Node<T>* r=new Node<T>; r->data=n; r->next=top; top=r; } template<typename T> T stack<T>::pop() { Node<T> *ptr = top; top = top->next; T t=ptr->data; delete ptr; return t; } template<typename T> void stack<T>::print() { for(Node<T>* p=top;p;p=p->next) cout<<p->data<<" "; } template<typename T> T stack<T>::getTop() { return top->data; } template<typename T> bool stack<T>::stackEmpty() { if(top)return false; else return true; } bool In(char t) {//判断是否字符函数 if(t>='0'&&t<='9')return false; else return true; } char Precede(char a,char b) {运算符优先级函数 if(a=='('&&b==')'||a=='#'&&b=='#') return '='; else if(a=='(' || a=='#' || b=='(' || (a=='+'&&a=='-')&&(b=='*'||b=='/')) return '<'; else return '>'; } int Operate(int first,char t,int second) {//运算函数 switch(t) { case '+': return first+second; case '-': return first-second; case '*': return first*second; case '/': return first/second; } return 0; } int EvaluateExpression() { char theta,x; int a,b; stack<char>OPTR;//操作符 stack<int>OPND;//数字 OPTR.push('#'); string s; cin>>s; for(int i=0;i<s.length()-1;) { if (!In(s[i])) { int sum=s[i]-'0'; i++; for(;!In(s[i])&&i<s.length()-1;i++) { int t=s[i]-'0'; sum=sum*10+t; } OPND.push(sum); }// ch不是运算符则进OPND栈 else switch (Precede(OPTR.getTop(),s[i])) { //比较OPTR的栈顶元素和ch的优先权 case '<': //当前字符ch压入OPTR栈,读入下一字符ch OPTR.push(s[i]); i++; break; case '>': //弹出OPTR栈顶的运算符进行相应运算,并将运算结果入栈 theta=OPTR.pop(); a=OPND.pop(); b=OPND.pop(); OPND.push(Operate(b,theta,a)); break; case '=': x=OPTR.pop(); i++; break; } // switch } // while return OPND.pop(); } int main() { cout<<"帅成计算器支持括号版,格式:(表达式+##) 例:2+2##"<<endl; for(;;) { cout<<EvaluateExpression(); cout<<endl; } return 0; }
原文地址:https://www.cnblogs.com/vhyc/p/5479481.html