【问题描述】
设计算法函数,实现后缀表达式转换。
【输入形式】
每行输入一个运算表达式(假设表达式均为正确的表达式,只包含+-*/四则运算和小括弧),以#作为表达式结束。(表达式长度不超过80)
【输出形式】
输出表达式的后缀式
【样例输入】
23-(2-4)*2+36/(20-14)#
(100-23)/6+2*(13-9)-40#
((100-20)*2)-35#
【样例输出】
23 2 4 - 2 * - 36 20 14 - / +
100 23 - 6 / 2 13 9 - * + 40 -
100 20 - 2 * 35 -
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10
#define STACKINCREMENT 5
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
} SqStack;
int initStack(SqStack *s);
int emptyStack(SqStack *s);
int pushStack(SqStack *s, ElemType e);
int popStack(SqStack *s,ElemType *e);
int getTop(SqStack *s,ElemType *e);
int initStack(SqStack *s)
{
s->base=(ElemType*)malloc(STACK_INT_SIZE * sizeof(ElemType));
if(!s->base)return ERROR;
s->top=s->base;
s->stacksize=STACK_INT_SIZE;
return OK;
}
int emptyStack(SqStack *s)
{
if (s->top==s->base){
return OK;
}else {
return ERROR;
}
}
int pushStack(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)return ERROR;
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
return OK;
}
int popStack(SqStack *s,ElemType *e)
{
if (s->top==s->base)return ERROR;
--s->top;
*e=*s->top;
return OK;
}
int getTop(SqStack *s,ElemType *e)
{
if(s->base==s->top)return ERROR;
*e=*(s->top-1);
return OK;
}
//运算符优先级:可根据需要设计。
int f(char c)
{
switch(c){
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
default:
return -1;
}
}
//后缀式转换
void convert(char *exp,char *result){
SqStack s;
char *p=exp,e;
initStack(&s);
while(*p!='\0'){
if(isdigit(*p)){
*result++=*p;
}else if(*p=='('){
pushStack(&s,*p);
}else if(*p==')'){
while(getTop(&s,&e) && e!='('){
popStack(&s,&e);
*result++=' ';
*result++=e;
}
popStack(&s,&e);
}
else{
if (!isdigit(*p)){
*result++=' ';
}
while(getTop(&s,&e) && f(e)>=f(*p)){
popStack(&s,&e);
*result++=e;
*result++=' ';
}
pushStack(&s,*p);
}
p++;
}
while(!emptyStack(&s) && getTop(&s,&e) && e!='#'){
popStack(&s,&e);
*result++=e;
*result++=' ';
}
*result='\0';
}
int main()
{
char result[80]={'\0'},exp[80]={'\0'};
//补充代码实现读入多个表达式,并输出每个表达式的后缀式
while(scanf("%s",exp)==1){
convert(exp,result);
printf("%s\n",result);
}
return 0;
}