中缀表达式求值
中缀表达式求值直接上代码!在这里插入代码片#include<iostream>#include<stack>#include<string>using namespace std;typedef struct opera{char ch;int level;}Oper;Oper str[10] = {{'+',2}, {'-',2}, {'*',3}, {'/'
·
中缀表达式求值
直接上代码!
在这里插入代码片
#include<iostream>
#include<stack>
#include<string>
using namespace std;
typedef struct opera
{
char ch;
int level;
}Oper;
Oper str[10] = {{'+',2}, {'-',2}, {'*',3}, {'/',3}, {'%',3},{'(',1}}; //将运算符的优先级存入结构体数组中
stack<int> S1; //数字栈
stack<Oper> S2; //运算符栈
void func();
int main()
{
cout << "请输入表达式!!" << endl;
string s;
cin >> s;
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9') //如果是数字
{
int j = i + 1;
int cnt = s[i] - '0';
//如果是数字入栈,在字符串中大于9的数字是由多个字符构成,需要将其便是几位的数字
while (s[j] >= '0' && s[j] <= '9')
{
cnt = cnt * 10 + (s[j] - '0');
j++;
}
S1.push(cnt); //将数字入栈
i = j - 1;
}
else //如果是字符
{
if (s[i] == '(') //左括号直接入栈
{
Oper t;
t.ch = '(';
t.level = 1;
S2.push(t);
}
else if (s[i] == ')') //如果是右括号弹出一个运算符以及两个操作数进行运算,直到遇到左括号
{
while (S2.top().ch != '(')
{
func();
}
S2.pop(); //使左括号出栈
}
else //如果是运算符
{
if (S2.empty()) //第一个运算符直接入栈
{
for (int k = 0; k < sizeof(str) / sizeof(str[0]); k++)
{
if (s[i] == str[k].ch) {
S2.push(str[k]);
break;
}
}
}
//符号栈不为空,比较当前运算符和栈顶元素的优先级,如果大于栈顶元素优先级则入栈,否则将栈顶运算符拿出运算后,将 //当前运算符入栈,将结果入数字栈
else
{
for (int k = 0; k < sizeof(str) / sizeof(str[0]); k++)
{
if (s[i] == str[k].ch)
{
if (str[k].level > S2.top().level) S2.push(str[k]);
else //取出两个操作数运算
{
func();
S2.push(str[k]);
}
}
}
}
}
}
}
//当表达式字符串结束后弹一个运算符两个数字进行运算,然后将结果压入数字栈,直到栈空将最终结果压入数字栈
while (!S2.empty())
{
func();
}
cout << "结果为:" << S1.top(); //输出最终结果
return 0;
}
void func() //运算函数
{
int first = S1.top();
S1.pop();
int second = S1.top();
S1.pop();
int res = 0;
switch (S2.top().ch)
{
case '+': res = first + second;
break;
case '-': res = second - first;
break;
case '*': res = second * first;
break;
case '/': res = second / first;
break;
case '%': res = second % first;
break;
default:
break;
}
S1.push(res);
S2.pop();
}
更多推荐
已为社区贡献2条内容
所有评论(0)