数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10000
typedef struct
{
int *base;
int *top;
}sq;
int init(sq *s)
{
s->base=(int *)malloc(maxsize*sizeof(int));
if(!s->base)exit(-1);
s->top=s->base;
return 1;
}
int push(sq *s,int e)
{
*s->top++=e;
return 1;
}
int pop(sq *s)
{
s->top--;
return 1;
}
int gettop(sq *s)
{
int e;
e=*(s->top-1);
return e;
}
int empty(sq *s)
{
if(s->base==s->top)return 0;
else return 1;
}
int print(sq *s)
{
while(s->base!=s->top)
printf("%c",*(s->base++));
return 1;
}
int main()
{
int i;
sq l1,l2;
char s[100];
scanf("%s",s);
init(&l1);
init(&l2);
for(i=0;s[i]!='#';i++)
{
if(s[i]>='a'&&s[i]<='z')
push(&l1,s[i]);
else if(s[i]=='(')
push(&l2,s[i]);
else if(s[i]==')')
{
while(gettop(&l2)!='(')
{
push(&l1,gettop(&l2));
pop(&l2);
}
pop(&l2);
}
else
{
if(!empty(&l2)||gettop(&l2)=='(')push(&l2,s[i]);
else
{
if((s[i]=='*'&&gettop(&l2)!='*'&&gettop(&l2)!='/')||(s[i]=='/'&&gettop(&l2)!='*'&&gettop(&l2)!='/'))
push(&l2,s[i]);
else
{
push(&l1,gettop(&l2));
pop(&l2);
i--;
}
}
}
}
while(empty(&l2))
{
push(&l1,gettop(&l2));
pop(&l2);
}
print(&l1);
return 0;
}
/***************************************************
User name: jk160532姜兴友
Result: Accepted
Take time: 0ms
Take Memory: 176KB
Submit time: 2017-09-28 19:50:45
****************************************************/