前言:
一般算术表达(中缀表达),如#3*(4+2)/2-5#,#为表达式界定符,逆波兰
表达式(后缀表达式),如前述表达的后缀表达式为:3 4 2 + * 2 / 5 -。设中缀表达式的运算符有+、-、、/、#五种,运算符的优先级别从高到低为()、、/、+、-、#;
注意:
有括号先算括号内,再算括号外的,多层括号由内向外进行。
核心算法伪代码:
1.将两个栈初始化为#;
2.从左至右依次扫描表达式的每个字符,执行下述操作
2.1 若当前字符是运算对象,则输出该字符,处理下一个字符;
2.2 若当前字符是运算符且优先级别比栈 的栈顶运算符的优先级
高,则将该字符入栈 ,处理下一个字符;
2.3 若当前字符是运算符且优先级别比栈的栈顶运算符优先级别
低,则将栈的栈顶元素输出,当前字符入栈,处理下一个字符;
2.4 若当前字符是运算符且优先级别与栈的栈顶运算符的优先级相
等,则将栈的栈顶元素输出,当前字符入栈,处理下一个字符。
#include<iostream>
#include<stack>//使用标准库的栈所需头文件
using namespace std;
stack<char> s1;//运算符栈
stack<char> s2;//中间值栈
int youxianji(char x)//返回运算符号优先级
{
int y;
switch(x){
case '*':y=2;break;
case '/':y=2;break;
case '+':y=1;break;
case '-':y=1;break;
case '#':y=0;break;
}