中缀->后缀
#include <iostream>
using namespace std;
//实现中缀表达式转化为后缀表达式
//算法
// 输入:合法的后缀表达式
/*
逐个读取输入字符,若是操作数则直接输出
若是运算符,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶运算符,则栈顶元素依次出栈并输出,并将当前符号进栈
一直到最终输出后缀表达式为止
*/
#define MAXSIZE 20;
bool comparePriority(char c1, char c2) {
//c1代表栈顶操作符 c2代表输入运算符
//可用的运算符有
/*
+ - * / ( )
优先级:(=)>*=/>+=-
(括号优先级是最高的
遇到右括号则一直出栈到左括号
*/
if (c2 == '(') {
return true;
}
else if(c2==')')
{
return false;
}
else if ((c2 == '+' || c2 == '-')&&(c1=='+'||c1=='-'))
{
return false;
}
else if ((c2 == '+' || c2 == '-') && (c1 == '*' || c1 == '/'))
{
return false;
}
else if((c2=='*'||c2=='/') && (c1=='+'||c1=='-'))
{
return true;
}
else if((c2 == '*' || c2 == '/') && (c1 == '*' || c1 == '/'))
{
return false;
}
else if (c1 == '#') {
return true;
}
else if(c2=='#')
{
return false;
}
}
int main()
{
//定义操作符栈
char op[20];
string input;
std::cout << "请输入合法的中缀表达式:" << endl;
cin >> input;
//
//定义符号栈的指针,指向栈顶,初始化为-1
int top=-1;
//#号入栈
op[++top] = '#';
for (int i = 0; i < input.length(); i++) {
if (input[i] >= '0' && input[i] <= '9') { //代表是数字
//直接输出
std::cout << input[i];
}
else //是操作符
{
//比较该操作符和栈顶符号的优先级
/*
1.若是当前读取的运算符比栈顶运算符优先级高,则入栈,否则栈顶的运算符依次出栈
*/
if (comparePriority(op[top],input[i])) {
//栈顶操作符的优先级比输入运算符的优先级低
//运算符入栈
op[++top] = input[i];
}
else if(input[i]==')')
{
//出栈直到遇到左括号
while (op[top] != '(') {
std::cout << op[top--];
}
//左括号也出栈
op[top--];
}
else //栈顶操作符的优先级比输入运算符的优先级高
{
//出栈直到遇到比输入运算符优先级低的
while (!comparePriority(op[top], input[i])) {
std::cout << op[top--];
}
}
}
}
}
求值后缀
#include<iostream>
using namespace std;
/*
后缀表达式求值
输入:后缀表达式
从左至右依次扫描
若是操作数则入栈
若是运算符则将操作数栈的前两个数弹出进行运算,注意顺序,将结果压入操作数栈
*/
int main()
{
cout << "请输入合法的后缀表达式" << endl;
string exp = NULL;
//操作数栈
int num[20]; //用int类型
int top = -1; //栈顶指针为-1
cin >> exp; //输入表达式
for (int i = 0; i < exp.length(); i++)
{
if (exp[i] >= '0' && exp[i] <= '9')
{
//入栈 把char转int
num[++top] = exp[i]-'0';
}
else
{
//是运算符
int num1 = num[top--];
int num2 = num[top--];
int result;
if (exp[i] == '+')
{
result = num2 + num1;
}
else if(exp[i] == '-')
{
result = num2 - num1;
}
else if (exp[i] == '*')
{
result = num2 * num1;
}
else if (exp[i] == '/')
{
result = num2 / num1;
}
//将运算结果入栈
num[++top] = result;
}
}
cout << "运算结果是:" << num[0]<<endl;
}