数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
# include <stdio.h>
# include <stdlib.h>
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
typedef char SelemType;
typedef struct{
SelemType *base;
SelemType *top;
int stacksize;
} SqStack;
void InitStack(SqStack&S);
void Push(SqStack&S,SelemType e);
void Pop(SqStack&S,SelemType&e);
bool StackEmpty(SqStack&S);
void GetTop(SqStack&S,SelemType&e);
int prority(char op);// 定义相关操作符的优先级
/* 中缀转后缀 栈用来存操作符*/
int main()
{
int i=0;
char etop,epop;
SqStack S;
InitStack(S);
char str[100];
gets(str);
while(str[i]!='#')
{
//字母直接输出
if('a'<=str[i] && str[i]<='z')
printf("%c",str[i]);
else
{
// 栈空进栈
if(StackEmpty(S))
Push(S,str[i]);
else
{
GetTop(S,etop); // prority(str[i]) pority(etop)
if(prority(str[i]) >= prority(etop)) // 1 ) ( */ + -
{ // 2 ( */ + -
// 是')'将栈中'('之上的操作符输出// 3 */ + -
if(prority(str[i]) == 4) // 4 +/ + -
{
while(etop!='(')
{
Pop(S,epop);
printf("%c",epop);
GetTop(S,etop);
}
Pop(S,epop);//弹出'('
}
else
{
Push(S,str[i]);
}
} // prority(str[i]) pority(etop)
else // 5 + - */ (
{ // 6 */ (
if(etop!='(')
{
Pop(S,epop);
printf("%c",epop);
Push(S,str[i]);
}
else
{
Push(S,str[i]);
}
}
}
}
i++;
}
GetTop(S,etop);
while(!StackEmpty(S))
{
printf("%c",etop);
Pop(S,epop);
GetTop(S,etop);
}
return 0;
}
void InitStack(SqStack&S)
{
S.base = (SelemType*)malloc(STACK_INIT_SIZE*sizeof(SelemType));
if(!S.base)
{
exit(0);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
void Push(SqStack&S,SelemType e)
{
if(S.top - S.base >= S.stacksize)
{
S.base = (SelemType*)realloc(S.base,(STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SelemType));
if(!S.base)
{
exit(0);
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top = e;
S.top++;
//*S.top++ = e;
}
void Pop(SqStack&S,SelemType&e)
{
if(S.top == S.base)
return;
else
{
//e = *--S.top;
S.top--;
e = *S.top;
}
}
bool StackEmpty(SqStack&S)
{
if(S.top == S.base)
return true;
else
return false;
}
void GetTop(SqStack&S,SelemType&e)
{
if(S.top == S.base)
return;
else
e = *(S.top-1);
}
int prority(char c)
{
if(c == '+' || c == '-')
return 1;
if(c == '*' || c == '/')
return 2;
if(c == '(')
return 3;
if(c == ')')
return 4;
}