算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ERROR - 1
#define MAXLENTH 100
#define maxsize 20
typedef char ElementType;
typedef struct snode* PtrToSnode;
struct snode
{
ElementType data;
PtrToSnode next;
};
typedef PtrToSnode mystack;
bool isEmpty(mystack ms);
mystack create();
bool pushdata(mystack ms, ElementType X);
ElementType popdata(mystack ms);
int OprToDig(char ch);
int OprToDig(char ch)
{
int val;
switch (ch)
{
case '+':
val = 1;
break;
case '-':
val = 1;
break;
case '*':
val = 2;
break;
case '/':
val = 2;
break;
case '(':
val = 0;
break;
case ')':
val = 0;
break;
default:
printf("%c is invalid Charn", ch);
break;
}
return val;
}
mystack create()
{
mystack ms = (mystack)malloc(sizeof(struct snode));
ms->next = NULL;
return ms;
}
bool isEmpty(mystack ms)
{
return (ms->next == NULL);
}
bool isFull(mystack ms)
{
return (ms->next == maxsize - 1);
}
bool pushdata(mystack ms,ElementType x)
{
bool rlt = false;
PtrToSnode tmpcell = (PtrToSnode)malloc(sizeof(struct snode));
tmpcell->data = x;
tmpcell->next = ms->next;
ms->next = tmpcell;
rlt = true;
return rlt;
}
ElementType popdata(mystack ms)
{
if(isEmpty(ms))
{
printf("empty stcak.\n");
return ERROR;
}
else
{
ElementType rlt = ms->next->data;
PtrToSnode tmpcell;
tmpcell = ms->next;
ms->next = tmpcell->next;
free(tmpcell);
return rlt;
}
}
int main()
{
bool flag = false;
bool isFirst = true;
mystack stk = create();
char exrn[MAXLENTH];
gets(exrn);
int i = 0;
while(exrn[i]!='\0')
{
if(((i==0) && (exrn[i]=='-'||exrn[i]=='+')) || ((exrn[i]>='0' && exrn[i]<='9')||exrn[i]=='.') || ((exrn[i]=='-'||exrn[i]=='+')&&exrn[i-1]=='('))
{
if(flag && !isFirst)
{
printf(" ");
flag = false;
}
isFirst = false;
if(exrn[i] == '+')
{
i++;
}
printf("%c", exrn[i]);
i++;
while((exrn[i]>='0' && exrn[i] <= '9')|| exrn[i] == '.')
{
printf("%c",exrn[i++]);
}
continue;
}
else
{
flag = true;
if(exrn[i] == '(')
{
pushdata(stk,exrn[i]);
}
else if(exrn[i] == ')')
{
ElementType ch;
while((ch = popdata(stk))!='(')
{
printf(" %c",ch);
}
}
else
{
if(isEmpty(stk))
{
pushdata(stk,exrn[i]);
}
else
{
if( OprToDig(exrn[i]) > OprToDig(stk->next->data))
{
pushdata(stk,exrn[i]);
}
else if(OprToDig(exrn[i]) <= OprToDig(stk->next->data))
{
do
{
printf(" %c", popdata(stk));
}
while( (stk->next!=NULL)&&(OprToDig(exrn[i]) <= OprToDig(stk->next->data)) );
pushdata(stk,exrn[i]);
}
}
}
}
i++;
}
while(!isEmpty(stk))
{
printf(" %c", popdata(stk));
}
system("pause");
}