练习9.52:使用stack处理括号化的表达式。当你看到一个左括号,将其记录下来。当你在一个左括号之后看到一个右括号,从stack中pop对象,直至遇到右括号,将左括号也一起弹出栈。让后将一个值(括号内的运算结果)push到栈中,表示一个括号化的(子)表达式已经处理完毕,被其运算结果所替代。
说明:上一篇写了关于中缀表达式求值的问题,对计算机而言,后缀表达式求值更加方便,不需要考虑符号的优先级,本篇在上一篇的基础上进行了小小改动,将中缀表达式的求值过程转化为后缀表达式的求值过程。
网上对于中缀表达式以及后缀表达式的例子,很多,这里不赘述,附上源码
/*
*练习9.52(续)
*2015/8/9
*说明:在练习9.52的基础啊上,将中缀表达式转化为后缀表达式进行计算,主要过程和9.52的几乎一样,但各个函数的功能更加明确(符数的情况没有考虑)
*int priority() 符号的优先级
*void shapeExpression(vector<string> vec);中缀表达式转后缀表达式
*int caculate();栈的计算过程
*int caclcuExpression();后缀表达式的计算过程
*参考:海子
*参考网址:http://www.cnblogs.com/dolphin0520/p/3708602.html
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*/
#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
int priority(string opt)
{
int p = 0;
if(opt == "+" || opt == "-")
p = 1;
if(opt == "*" || opt == "/")
p = 2;
if(opt == "(")
p = 0;
return p;
}
vector<string> shapeExpression(vector<string> &vec)
{
stack<string> stack_opt;
vector<string> vec2;
for(auto i = 0; i != vec.size(); ++i)
{
string token = vec[i];
if(token == "+" || token == "-" || token == "*" || token == "/")
{
if(stack_opt.size() == 0)
stack_opt.push(token);
else
{
int token_p = priority(token);
string top_opt = stack_opt.top();
int opt_p = priority(top_opt);
if(token_p > opt_p)
stack_opt.push(token);
else {
while(token_p <= opt_p)
{
//stack_opt.pop();
vec2.push_back(top_opt);
stack_opt.pop();
if(stack_opt.size() != 0)
{
top_opt = stack_opt.top();
opt_p = priority(top_opt);
}
else
break;
}
stack_opt.push(token);
}
}
}
else if(token == "(")
stack_opt.push(token);
else if(token == ")")
{
while(stack_opt.top() != "(")
{
string top_opt = stack_opt.top();
vec2.push_back(top_opt);
stack_opt.pop();
}
stack_opt.pop();
}
else
{
vec2.push_back(token);
}
}
while(stack_opt.size() != 0)
{
string top_opt = stack_opt.top();
vec2.push_back(top_opt);
stack_opt.pop();
}
/*
for(int i = 0; i != vec2.size(); ++i)
cout << vec2[i] << " ";
cout << endl;*/
return vec2;
}
int calculate(stack<int> &stack_opd,string opt)
{
if(opt == "+")
{
int ropd = stack_opd.top();
stack_opd.pop();
int lopd = stack_opd.top();
stack_opd.pop();
int result = lopd + ropd;
stack_opd.push(result);
}
if(opt == "-")
{
int ropd = stack_opd.top();
stack_opd.pop();
int lopd = stack_opd.top();
stack_opd.pop();
int result = lopd - ropd;
stack_opd.push(result);
}
if(opt == "*")
{
int ropd = stack_opd.top();
stack_opd.pop();
int lopd = stack_opd.top();
stack_opd.pop();
int result = lopd * ropd;
stack_opd.push(result);
}
if(opt == "/")
{
int ropd = stack_opd.top();
stack_opd.pop();
int lopd = stack_opd.top();
stack_opd.pop();
int result = lopd / ropd;
stack_opd.push(result);
}
}
int calcuExpression(vector<string> vec)
{
stack<int> stack_opd;
//string s = "0123456789"
for(int i = 0; i != vec.size(); ++i)
{
string token = vec[i];
if(token == "+"|| token == "-" || token == "*" || token == "/")
calculate(stack_opd,token);
else
stack_opd.push(atoi(token.c_str()));
}
return stack_opd.top();
}
int main()
{
vector<string> v1 = {"(","1","+","2",")","*","4","/","(","1","+","1",")"};
for(auto i = 0; i != v1.size(); ++i)
cout << v1[i] << " ";
cout << endl;
vector<string> v2 = shapeExpression(v1);
for(auto i = 0; i != v2.size(); ++i)
cout << v2[i] << " ";
cout << endl;
cout << calcuExpression(v2) << endl;
return 0;
}