Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERLOAD -2
#define ERROR 0
#define OK 1
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}Sqstack;
void InitStack(Sqstack &s)//初始化栈
{
s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s.base)
{
exit(OVERLOAD);
}
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
}
int GetTop(Sqstack s, ElemType &e)
{
if(s.top == s.base) return ERROR;
e = *(s.top-1);
return OK;
}
void Push(Sqstack &s, ElemType e)//入栈
{
if(s.top-s.base>=s.stacksize)
{
s.base = (ElemType*)realloc(s.base, (s.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!s.base) exit(OVERLOAD);
s.top = s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++ = e;
}
int Pop(Sqstack &s, ElemType &e)//出栈,并将元素赋给e
{
if(s.top == s.base) return ERROR;
e = *--s.top;
return OK;
}
int main()
{
char s[10005];
Sqstack li;
InitStack(li);
scanf("%s", s);
int i = 0;
ElemType e;
while(s[i]!='#')
{
if(s[i]>='a'&&s[i]<='z')
{
printf("%c", s[i]);
}
else
{
if(s[i] == '*'||s[i] == '/')
{
Push(li, s[i]);
}
else if(s[i] == '+'||s[i] == '-')
{
while(li.top!=li.base&&*(li.top-1)!='(')//此时为+-时需要一直输出到此为止,不是只输出栈顶就结束
{
Pop(li, e);
printf("%c", e);
}
Push(li, s[i]);
}
else if(s[i]=='(') Push(li, s[i]);
else if(s[i] == ')')
{
while(*(li.top-1)!='(')
{
Pop(li, e);
printf("%c", e);
}
Pop(li, e);
}
}
i++;
}
while(GetTop(li, e)!=ERROR)//输出栈中剩余的元素
{
Pop(li, e);
printf("%c", e);
}
printf("\n");
}
435

被折叠的 条评论
为什么被折叠?



