一,中缀后缀表达式转换原理,网上的相关解释很多,我参考的是这一篇
链接直接跳转到我参考的文章
二,中缀表达式转后缀表达式的实现
我只实现了基本的+-*/()这几个符号,以后自己如果需要可能会加
我用的是1+2*3+(4*5+6)*7这个表达式进行测试,本人较懒,不打算测试更多
话不多说,贴代码
//
// Created by jiahang on 2018/5/23.
// 完成简单的后缀表达式,可以进行+-*/的后缀表达式生成
// 存在一些cast问题,没有处理
//
#include <iostream>
#include <string>
#include <stack>
using namespace std;
void suffix() {
int value = 0;
stack<char> s;
string input;
cin >> input;
for (int i = 0; i < input.length(); i++) {
int j = i;
value = 0;
bool hasNumber = false;
//从input的起点开始,进行判断
for (; j < input.length(); j++) {
//从字符串中读取数字
if (input.at(j) <= '9' && input.at(j) >= '0') {
//如果下表所在的地方是数字,就更新value
hasNumber = true;
value += 10 * value + input.at(j) - '0';
} else {
break;
}
}
if (hasNumber) {
//进行这个判断是为了防止出现即使上一个字串不是数值,也会输出一个value=0的情况
cout << value << " ";//输出一个值加一个空格
hasNumber = false;
}
//解释一下为什么要进行下面这个判断,因为在上面的一层循环中,会使得j=input.length()
//如果在这里直接把j赋值给i,就会造成下标越界,因此判断到最后一个数字之后,应当把
//i=input.length()-1作为正确的处理方式
if(j<input.length()){
i = j;//把j所在的下标,就是不是数字的下标给i
}
else{
i= static_cast<int>(input.length() - 1);//这一段会有unsigned转int的警告,静态cast处理一下
}
char temp = input.at(i);
if (temp == '(') {
//由于左括号的优先级最高,所以栈中一定是优先级更低的
// 所以遇到左括号就直接入栈
s.push(temp);
} else if (temp == '+' || temp == '-') {
//由于+-的优先级最低,因此,遇到了加减,肯定是要把栈中所有的东西输出,除非遇到了(
//然后把+-压入
while (!s.empty() && s.top() != '(') {
cout << s.top() << " ";
s.pop();
}
s.push(temp);
} else if (temp == ')') {
//遇到右括号的时候一直弹出,直到遇到左括号
while (s.top() != '(' && !s.empty()) {
//防止用户输入错误,导致括号不匹配的现象,因此也加入栈空的判断
cout << s.top() << " ";
s.pop();
}
if (!s.empty()) {
s.pop();//由于左括号不输出,也弹出一次
}
//右括号本身也不输出
} else if (temp == '*' || temp == '/') {
//当遇到*/的时候,要弹出直到遇到(,+,-
while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
cout << s.top() << " ";
s.pop();
}
s.push(temp);
}
}
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}
}
int main(void){
suffix();
return 0;
}
本文简要介绍了C++如何将后缀表达式转换为中缀表达式,作者主要实现了基本的加减乘除和括号操作,并使用1+2*3+(4*5+6)*7作为测试用例。代码实现未涵盖更复杂的测试场景。
841

被折叠的 条评论
为什么被折叠?



