题目链接:点击打开链接
数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
从原表达式求得后缀式的规律为:
1) 设立操作符栈;
2) 设表达式的结束符为“#”,予设运算符栈的栈底为“#”;
3) 若当前字符是操作数,则直接发送给后缀式。
4) 若当前运算符的优先数高于或等于栈顶运算符,则进栈;
5) 否则,退出栈顶运算符发送给后缀式;
6) “(” 对它之前后的运算符起隔离作用,“)”可视为自相应左括弧开始的表达式的结束符。
来源
代码实现:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>
using namespace std;
#define stackmax 10000
#define stacknum 10000
typedef struct
{
char *top;
char *base;
int stacksize;
}Sqstack;
int initstack(Sqstack &s)
{
s.base=(char *)malloc(stackmax*sizeof(char ));
if(!s.base)
return -1;
s.top=s.base;
s.stacksize=stackmax;
return 0;
}
int Empty(Sqstack &s)
{
if(s.top==s.base)
return 0;
else
return 1;
}
int push(Sqstack &s,char m)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(char *)realloc(s.base,(s.stacksize+stacknum)*sizeof(char ));
if(!s.base)
return -1;
s.top=s.base+s.stacksize;
s.stacksize+=stacknum;
}
*(s.top++)=m;
return 0;
}
int pop(Sqstack &s)
{
if(s.top==s.base)
return -1;
s.top--;
return 0;
}
int Gettop(Sqstack &s,char &m)
{
if(s.top==s.base)
return -1;
m=*(s.top-1);
return 0;
}
void Match(Sqstack &s,char a[])
{
char ch;
for(int i=0;a[i]!='#';i++)
{
if(a[i]>='a'&&a[i]<='z')
printf("%c",a[i]);
else if(a[i]=='(')///左括号直接进栈
push(s,a[i]);
else if(a[i]==')')
{
Gettop(s,ch);
while(ch!='(')///如果栈顶不是左括号,一直输出
{
printf("%c",ch);
pop(s);
Gettop(s,ch);
}
pop(s);///左括号出栈
}
else if(a[i]=='+'||a[i]=='-')
{
Gettop(s,ch);
while(Empty(s)!=0&&ch!='(')
{
printf("%c",ch);
pop(s);
Gettop(s,ch);
}
push(s,a[i]);
}
else if(a[i]=='*'||a[i]=='/')
{
Gettop(s,ch);
while(Empty(s)!=0&&ch!='('&&(ch=='*'||ch=='/'))
{
printf("%c",ch);
pop(s);
Gettop(s,ch);
}
push(s,a[i]);
}
}///for
while(Empty(s)!=0)///输出栈内的剩余元素
{
Gettop(s,ch);
printf("%c",ch);
pop(s);
}
printf("\n");
}
int main()
{
Sqstack s;
char a[255];
scanf("%s",a);
initstack(s);
Match(s,a);
return 0;
}