C/C++带括号的四则运算
来源:互联网 发布:有个很污的女朋友知乎 编辑:程序博客网 时间:2024/05/05 13:03
(1).首先从string读入表达式,取出每一个字符后装入deque容器coll1中(源码在后面)。
(2).从该容器取出每一个元素,利用栈将中缀表达式转换成后缀表达式(可参考:http://blog.csdn.net/anye3000/article/details/7939203),将后缀表达式装入容器coll3中。
(3).最后从coll3中取出元素逐一处理,既使用逆波兰式求值(如下图)。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
C++源码
可编译并正常运行,此程序只支持一位数字运算,例如 3*(2+8)/5+6,有需要多位运算或者浮点型运算请自行修改,原理相同。
- #include<stack>
- #include<iostream>
- #include<deque>
- #include<string>
- using namespace std;
-
-
- bool isPra(char c)
- {
- if(c=='('||c==')')
- return true;
- else
- return false;
- }
-
-
- int getPri(char c)
- {
- switch(c)
- {
- case '+':
- case '-':
- return 0;
- break;
- case '*':
- case '/':
- return 1;
- break;
- case '(':
- case ')':
- return -1;
- break;
- }
- }
-
-
- void check(char c, stack<char>& coll2, deque<char>& coll3)
- {
- if(coll2.empty())
- {
- coll2.push(c);
- return;
- }
-
- if(isPra(c))
- {
- if(c=='(')
- coll2.push(c);
- else
- {
-
- while(coll2.top()!='(')
- {
- char ch = coll2.top();
- coll3.push_back(ch);
- coll2.pop();
- }
-
-
- coll2.pop();
- }
- }
- else
- {
-
- char sym = coll2.top();
-
-
- if(getPri(c)<=getPri(sym))
- {
-
- coll2.pop();
-
- coll3.push_back(sym);
-
- check(c,coll2,coll3);
- }
- else
- {
-
- coll2.push(c);
- }
- }
- }
-
-
- void allocate(deque<char>& coll1, stack<char>& coll2, deque<char>& coll3)
- {
- while(!coll1.empty())
- {
- char c = coll1.front();
- coll1.pop_front();
-
- if(c>='0'&&c<='9')
- {
- coll3.push_back(c);
- }
- else
- {
-
- check(c,coll2,coll3);
- }
-
- }
-
-
- while(!coll2.empty())
- {
- char c = coll2.top();
- coll3.push_back(c);
- coll2.pop();
- }
- }
-
-
- void calculate(deque<char>& coll3, stack<int>& coll4)
- {
- while(!coll3.empty())
- {
- char c = coll3.front();
- coll3.pop_front();
-
-
- if(c>='0'&&c<='9')
- {
-
- int op = c-'0';
- coll4.push(op);
- }
- else
- {
- int op1 = coll4.top();
- coll4.pop();
- int op2 = coll4.top();
- coll4.pop();
- switch(c)
- {
- case '+':
- coll4.push(op2+op1);
- break;
- case '-':
- coll4.push(op2-op1);
- break;
- case '*':
- coll4.push(op2*op1);
- break;
- case '/':
- coll4.push(op2/op1);
- break;
- }
- }
- }
- }
-
-
- int main()
- {
- deque<char> coll1;
- stack<char> coll2;
- deque<char> coll3;
- stack<int>coll4;
- string str;
- cout<<"请输入表达式,按enter结束:"<<endl;
- cin>>str;
- for(int i=0;i!=str.size();++i)
- {
-
- coll1.push_back(str[i]);
- }
-
-
- allocate(coll1,coll2,coll3);
-
-
- calculate(coll3,coll4);
- cout<<"计算结果为:"<<coll4.top()<<endl;
- }
转载自:http://blog.csdn.net/mvpsendoh/article/details/6440835
0 0