算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
struct SNode {
char Data[MaxSize];
int Top;
};
typedef struct SNode *Stack;
Stack CreateStack(){
Stack p;
p=(Stack)malloc(sizeof(struct SNode));
p->Top=-1;
return p;
}
void push(Stack S,char x){
if(S->Top==MaxSize){
printf("Stack Full\n");
}else{
S->Data[++S->Top]=x;
}
}
int prit(Stack S,char x){
if(S->Data[S->Top]=='(')return 1;
else
{
if(x=='+'||x=='-'&&(S->Data[S->Top]=='*'||(S->Data[S->Top]=='/')))
return 0;
else if(x=='*'||x=='/'&&(S->Data[S->Top]=='+'||(S->Data[S->Top]=='-')))
return 1;
else if(x=='+'||x=='-'&&(S->Data[S->Top]=='+'||S->Data[S->Top]=='-'))
return 0;
else if(x=='*'||x=='/'&&(S->Data[S->Top]=='*'||S->Data[S->Top]=='/'))
return 0;
}
}
char pop(Stack S){
if(S->Top==-1){
printf("Stack is Empty!\n");
}else{
char t;
t=S->Data[S->Top];
S->Top--;
return t;
}
}
int main(){
char ch,a[MaxSize],t;
Stack S;
S=CreateStack();
scanf("%[^\n]",a);
getchar();
/*吸收\n */
int f=0,first=1,i=0;
while(a[i]!='\0'){
if(!i){
if(a[i]>='0'&&a[i]<='9'||a[i]=='-')/*处理负号*/
{
printf("%c",a[i++]);
while(a[i]>='0'&&a[i]<='9'||a[i]=='.')/*注意小数点*/
printf("%c",a[i++]);
}
else if(a[i]=='+')/*处理正号 */
{
i++;
while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
printf("%c",a[i++]);
}
else{
/*第一个为除了数字,负号,正号的运算符,则不起效果,讲下一个符号压入堆栈*/
push(S,a[i++]);f=1;
}
}/*处理第一个数字*/
else{
if(a[i]>='0'&&a[i]<='9'||a[i]=='.'){
if(!f){
printf(" %c",a[i++]);/*f用于判断连续数字之间是否要有间隔 */
}else{
printf("%c",a[i++]);f=0;
}
while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
{
printf("%c",a[i++]);
}
}else{
/*处理符号*/
if(S->Top==-1)push(S,a[i++]);
else{
switch(a[i]){
case '(':push(S,a[i++]);break;
case ')':{
while(1){
if((t=pop(S))=='('){
break;
}
printf(" %c",t);
}
i++;
break;
}
case '+':{
if(a[i-1]=='('){
i++;first=1;
/*数字前的正号*/
while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
{
if(first){
printf(" %c",a[i++]);first=0;
}else{
printf("%c",a[i++]);
}
}
break;
}else{
if(prit(S,a[i])){
push(S,a[i++]);
}else{
while(!prit(S,a[i])){
if(S->Top==-1)break;
printf(" %c",pop(S));
if(S->Top==-1)break;
}
push(S,a[i++]);
}
break;
}
}
case '-':{
if(a[i-1]=='('){
printf(" %c",a[i++]);
/*数字前的负号 */
while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
printf("%c",a[i++]);
break;
}else{
if(prit(S,a[i])){
push(S,a[i++]);
}else{
while(!prit(S,a[i])){
if(S->Top==-1)break;
printf(" %c",pop(S));
if(S->Top==-1)break;
}
push(S,a[i++]);
}
break;
}
}
case '*':
case '/':{
if(prit(S,a[i])){
push(S,a[i++]);
}else{
while(!prit(S,a[i])){
if(S->Top==-1)break;
printf(" %c",pop(S));
if(S->Top==-1)break;
}
push(S,a[i++]);
}
break;
}
}
}
}
}
}
while(S->Top!=-1){
printf(" %c",pop(S));
}
printf("\n");
return 0;
}