最近又在复习DS,不知道自己当时更博为什么不写注释和算法思想,大无语……
/*
* 逆波兰式算法的实现:
* 首先分配两个stack,一个是临时存储运算符的stack s1(包含一个结束符号'#'),一个作为输入逆波兰式的stack s2
* 那么,首先s1开始的时候,push('#') 表示s1的结束标志
* <1> 如果取出的字符是'(',push('(')
* <2> 如果取出的字符是')',将距离s1栈顶最近的'('之间的字符依次出栈(不包含'('),然后送入s2,最后,将字符'('出栈
* <3> 如果取出的是操作数,那么,将完整的操作数push s2(包括浮点数的小数点)
* <4> 如果取出的是运算符,那么,将该运算符与s1.top()的运算符的优先级比较,如果,大于栈顶运算符,
* 那么push s1,否则,pop s1将运算符送入s2,至到栈顶运算符低于该运算符,那么,将该运算符push s1
* <5> 重复上面1~4的步骤,直到处理完所有的输入字符
* <6> 如果取出的字符是'#',那么,将s1的所有的字符pop,然后依次送入s2
————————————————
版权声明:截取的注释为CSDN博主「SevenMIT」的原创文章,原文链接:https://blog.csdn.net/SevenMIT/article/details/9010035*/
#include<iostream>
#include<string>
using namespace std;
typedef char ElemType;
#define ERROR 1
#define OK 0
#define MAXSIZE 100
#define INCREASE 100
typedef struct SqStack{
ElemType* base;
ElemType* top;
ElemType* temp;//栈顶的直接后继
int stacksize;
}SqStack,*SqStackList;
void InitSqStack( SqStackList & S ){
S->base = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
if (!S->base) exit(OVERFLOW);
S->top = S->temp = S->base;
S->stacksize = MAXSIZE;
}
void Push(SqStackList& S, ElemType e) {
*S->top = e;
S->top++;
S->temp = S->top - 1;
}
char priority(char c1, char c2) {
char result='=';
if (c2 == '+' || c2 == '-') {
switch (c1) {
case'(':
result='>'; break;
case'#':
result = '>'; break;
default:
result = '<';
}
}
if (c2 == '*' || c2 == '/') {
switch (c1) {
case'*':
result = '<'; break;
case'/':
result = '<'; break;
case')':
result = '<'; break;
default:
result = '>';
}
}
if (c2 == '(')
result = '>';
if (c2 == ')') {
switch (c1) {
case'(':
result = '='; break;
default:
result = '<';
}
}
if (c2 == '#') {
switch (c1) {
case'#':
result = '='; break;
default:
result = '>';
}
}
return result;
}
void Pop(SqStackList& S) {
S->top--;
S->temp = S->top - 1;
}
void Nibolan(SqStackList& S, string t) {
Push(S, '#');
char ch, c1;
for (int i = 0; i < t.size(); i++) {
ch = t[i];
if (ch >= 'a' && ch <= 'z')
cout << t[i];
else {
c1 = *(S->temp);
switch (priority(c1, ch)) {
case'<':
cout << c1;
Pop(S);
i--;
break;
case'>':
Push(S, ch); break;
case'=':
Pop(S);
default:break;
}
}
}
while (S->base != S->top) {
cout << *(--S->top);
Pop(S);
}
}
void main() {
SqStackList S;
S = (SqStackList)malloc(sizeof(SqStack));
string t;
getline(cin, t);
InitSqStack(S);
Nibolan(S, t);
}