![这里写图片描述](https://img-blog.csdn.net/20170221090523898?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE0ODExODc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
上网查了一下,采用后缀表达式
从中序表达式 转换为 后序表达式
由于后续表达式更易计算机去解决,所以我们在运算算术表达式时要先转换为后序的。方法如下
建立符号栈
顺序扫描中序表达式
a) 是数字, 直接输出
b) 是运算符
i : “(” 直接入栈
ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(“, “(“只出栈, 不输出
iii: 其他符号, 将符号栈中的元素依次出栈并输出, 直到 遇到比当前符号优先级更低的符号或者”(“。 将当前符号入栈。
扫描完后, 将栈中剩余符号依次输出
例 : 3+(2-5)*6/3
遇到 3 是数字输出
表达式 : 3
符号栈 :
遇到”+” 号 , 利用法则iii ,栈中没有优先级更低的符号, 直接入栈
表达式 : 3
符号栈 : +
遇到”(” , 利用 法则i, 直接入栈
表达式 : 3
符号栈 : + (
遇到”2” 输出
表达式 : 3 2
符号栈 : + (
遇到 “-” , 利用法则iii , 遇到”(“, 没有出栈符号, 直接入栈
表达式 : 3 2
符号栈 : + ( -
遇到”5” 输出
表达式 : 3 2 5
符号栈 : + ( -
遇到”)” 利用法则ii , 将”-“号出栈输出, “(” 出栈
表达式 : 3 2 5 -
符号栈 : +
遇到”*” 利用法则ii , “*” 比”+”的优先级低, 所以遇到优先级更低的符号, 不用出栈, 将”*”入栈
表达式 : 3 2 5 -
符号栈 : + *
遇到”6” 输出
表达式 : 3 2 5 - 6
符号栈 : + *
遇到”/” 利用法则ii , “/” 与”*”的优先相同, 就是说”*”不是优先级更低的符号, 所以出栈输出, 继续 “+”比”/”的优先级低, 不用出栈, 将”/”入栈
表达式 : 3 2 5 - 6 *
符号栈 : + /
遇到”3” 输出
表达式 : 3 2 5 - 6 * 3
符号栈 : + /
扫描完成 将符号栈内的符号依次输出
表达式 : 3 2 5 - 6 * 3 / +
直接过的代码
# include <iostream>
# include <string.h>
#include <string>
#include<stack>
#include<windows.h>
using namespace std;
stack<string> s_ch;
stack<string> s_num;
stack<string> s_temp;
int strtoint(string s)
{
return atoi(s.c_str());
}
string inttostr(int num)
{
char a[10];
itoa(num,a,10);
string b;
b = a;
return b;
}
int main()
{
int a,b;
string s;
string f="";
string s1 = "";
string temp = "";
cin >> s;
int len;
len = s.length();
for (int i = 0; i<len; i++)
{
s1 = s[i];
if (s[i] <= '9' && s[i] >= '0')
{
temp += s[i];
if (s[i + 1] > '9' || s[i + 1] < '0')
{
s_num.push(temp);
temp = "";
}
}
else
{
if (s[i] == '(')
s_ch.push("(");
else if (s[i] == ')')
{
while (s_ch.top() != "(")
{
s_num.push(s_ch.top());
s_ch.pop();
}
s_ch.pop();
}
else
{
if(s_ch.empty())
s_ch.push(s1);
else
{
if ((s[i] == '+' || s[i] == '-') && (s_ch.top() == "+" || s_ch.top() == "-" || s_ch.top() == "*" || s_ch.top() == "/"))
{
s_num.push(s_ch.top());
s_ch.pop();
s_ch.push(s1);
}
else if ((s[i] == '+' || s[i] == '-') && (s_ch.top() == "("))
s_ch.push(s1);
if ((s[i] == '*' || s[i] == '/') && (s_ch.top() == "+" || s_ch.top() == "-" || s_ch.top() == "("))
s_ch.push(s1);
else if ((s[i] == '*' || s[i] == '/') && (s_ch.top() == "*" || s_ch.top() == "/"))
{
s_num.push(s_ch.top());
s_ch.pop();
s_ch.push(s1);
}
}
}
}
}
while (!s_ch.empty())
{
s_num.push(s_ch.top());
s_ch.pop();
}
while(!s_num.empty())
{
s_temp.push(s_num.top());
s_num.pop();
}
int flag = 0;
string s3;
while (!s_temp.empty())
{
s3 = s_temp.top();
f += s3;
if(s3 != "+" && s3 != "-" && s3 != "*" && s3 != "/")
{
s_num.push(s3);
}
else
{
flag = 1;
b = strtoint(s_num.top());
s_num.pop();
a = strtoint(s_num.top());
s_num.pop();
if(s3 == "+")
a += b;
if(s3 == "-")
a -= b;
if(s3 == "*")
a *= b;
if(s3 == "/")
a /= b;
s_num.push(inttostr(a));
}
s_temp.pop();
}
if(flag)
cout << a;
else
cout <<strtoint(s3);
}