C++栈实现中缀转后缀
算法思想
手算
① 先确定运算符的顺序 ② 按[左操作数,右操作数,运算符]方式组合成一个新操作数。 ③ 重复执行②直到所有的运算符都被处理 “左优先”原则:只要左边的运算符能先计算,就先算左边的。
用栈具体实现
① 初始化一个栈,用于保存暂时还不能确定的运算符。 ② 从左到右处理各个元素,直到末尾,可能有三种情况 (1)遇到操作数。直接加入后缀表达式。 (2)遇到界限符。遇到左括号直接入栈;遇到右括号依次弹出栈内运算符并加入后缀表达式,直到弹出左括号为止。注意:左括号不加入后缀表达式。 (3)遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符并加入后缀表达式,若遇到左括号或者栈空就停止。之后再把当前运算符入栈。 ③ 按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,加入后缀表达式。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<stack>
#include<iostream>
using namespace std;
#define MaxSize 1000
//中缀表达式转后缀表达式
//优先级比较
//s1的优先级低于s2返回true
bool Pricom(char s1, char s2) {
if ((s1 == '+' || s1 == '-') && (s2 == '*' || s2 == '/'))
{
return true;
}
return false;
}
void Suffix(char* str, char* suf) {//中缀表达式输入和后缀表达式结果
stack<char>s;//定义栈
s.push(10000);//压一个大数防止s为空栈时不能调用pop()
int m = 0;//suf的下标
for (int i = 0; i < strlen(str); i++){//从左到右扫描所有元素,直到末尾
if (str[i] >= '0' && str[i] <= '999'){
suf[m++] = str[i];//遇到操作数直接加入后缀表达式。
}
else if (str[i] == '(') {
s.push(str[i]);//遇到左括号直接入栈
}
else if (str[i] == ')'){//遇到右括号依次弹出栈内运算符并加入后缀表达式
while (s.top()!='('){//直到弹出左括号为止,但左括号不加入后缀表达式
suf[m++] = s.top();
s.pop();
}
s.pop();
}
else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') {//遇到运算符
while (Pricom(str[i], s.top()) && s.top()!='(' && !s.empty())//栈中优先级高于或等于当前运算符的所有运算符
{
suf[m++] = s.top();//依次弹出并加入后缀表达式
s.pop();
}//若遇到左括号或者栈空就停止
s.push(str[i]);//再把当前运算符入栈
}
}
while (!s.empty()&&s.top() != 10000)//压栈底的大数不出栈
{
suf[m++] = s.top();//剩余运算符依次出栈,加入后缀表达式
s.pop();
}
suf[m - 1] = '\0'; // 确保suf不会有多余内容
}
int main(void) {
char a[MaxSize] = " ";
cin >> a;
char b[MaxSize] = " ";
Suffix(a, b);
cout << b;
return 0;
}
运行示例一: 运行示例二:
|