数据结构与算法—后缀表达式+中缀转后缀
● 在《数据结构与算法分析(C语言描述)》关于栈的应用里有后缀表达式和中缀到后缀的转换。看完之后觉得似乎有实现的可能,磨了很久终于实现了出来(小菜鸡一枚)。
1、后缀表达式
思路:1、输入后缀表达式。2、设置一个栈。3、将未遇到运算符的数字全部存入栈内。4、遇到运算符将栈内最上面的两个数弹出,通过该运算符计算后再存入栈内。5、依次循环。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
int InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];
if (!S.base) return 0;
S.top = S.base;
S.stacksize = MAXSIZE;
return 1;
}
int Push(SqStack &S, SElemType e)
{
if (S.top - S.base == S.stacksize) return 0;
*S.top++ = e;
return 1;
}
int Pop(SqStack &S, SElemType &e)
{
if (S.top == S.base) return 0;
e = *(--S.top);
return 1;
}
int main()
{
char a[MAXSIZE];
int val;
scanf("%s", a);
SqStack S;
InitStack(S);
for (int i = 0; a[i] != '\0'; i++)
{
if ('9' >= a[i] && a[i] >= '0')
{
Push(S, a[i] - '0');
}
else {
int val1 , val2 ;
Pop(S, val2);
Pop(S, val1);
if (a[i] == '+')
{
val = val1 + val2;
Push(S, val);
}
if (a[i] == '*')
{
val = val1 * val2;
Push(S, val);
}
}
}
Pop(S, val);
printf("%d", val);
return 0;
}
2、中缀到后缀的转换
思路:1、当读到的是一个数时,立即把它放到输出中。操作符先存入栈内。2、如果见到一个) ,那么就将栈元素弹出,将弹出的元素写出直到遇到( (只弹出,不输出)。3、当遇到+*(时,将元素压入栈内,直到遇到更低级的元素。
用图片理解一下:
如果你手中有《数据结构与算法分析》这本书,不放打开第75-76页,结合里面的文字去理解这个图。(其实此图和书上的例图是一样的哦~看懂了书上的意思就可以跳过我的思路内容啦。)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef char SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
int InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];
if (!S.base) return 0;
S.top = S.base;
S.stacksize = MAXSIZE;
return 1;
}
int Push(SqStack &S, SElemType e)
{
if (S.top - S.base == S.stacksize) return 0;
*S.top++ = e;
return 1;
}
int Pop(SqStack &S, SElemType &e)
{
if (S.top == S.base) return 0;
e = *(--S.top);
return 1;
}
SElemType GetTop(SqStack S)
{
if(S.top!= S.base)
return *(S.top -1);
return '\0';
}
int main(void)
{
char a[MAXSIZE];
int val;
scanf("%s", a);
SqStack S;
InitStack(S);
for (int i = 0; a[i] != '\0'; i++)
{
if('z' >= a[i] && a[i] >= 'a')
{
printf("%c", a[i]);
}
else{
if(a[i]=='+' || a[i]=='-')
{
while(GetTop(S)!= NULL && GetTop(S)!= '(')
{
if(GetTop(S)=='*' || GetTop(S)=='/' || GetTop(S)=='+' || GetTop(S)=='-')
{
SElemType val1;
Pop(S, val1);
printf("%c", val1);
}
}
Push(S,a[i]);
}
if(a[i]=='*' || a[i]=='/')
{
if(GetTop(S)=='+' || GetTop(S)=='-')
{
Push(S,a[i]);
}
else if(GetTop(S)=='*' || GetTop(S)=='/'){
SElemType val2;
Pop(S, val2);
printf("%c", val2);
Push(S,a[i]);
}
else{
Push(S,a[i]);
}
}
if(a[i]=='(')
{
Push(S,a[i]);
}
if(a[i]==')')
{
while(GetTop(S)!='(')
{
SElemType temp;
Pop(S, temp);
printf("%c", temp);
}
SElemType temp;
Pop(S, temp);
}
}
}
while(GetTop(S)!=NULL)
{
SElemType temp;
Pop(S, temp);
printf("%c", temp);
}
return 0;
}