数据结构实验之栈二:一般算术表达式转换成后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式

Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+

#include<stdio.h>
int switc(char c)//把输入的运算符转换成数字来比较优先级
 {
     if(c=='+'||c=='-') return 1;
     if(c=='*'||c=='/')  return 2;
     if(c=='(') return 3;
     if(c==')') return 4;
 }
 int main()
 {
     char b[1000];//b数组仿栈
     int top=0;
     char c;
     while(scanf("%c", &c))//输入直到#结束
     {
     	if(c=='#')
     		break;
         if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出
         {
             printf("%c",c);
         }
         else
         {
             if(top==0) //判断b栈是不是为空 是就直接入栈
             {
                 top++;//栈顶向上移一位
                 b[top] = c;//增加一个成员                
             }
             else
                 if(switc(c)>switc(b[top]))//如果是运算符 而且输入的比栈顶运算符优先级高
                 {
                     if(switc(c) == 4)//如果是')'就把'('之前的运算符全部输出
                     {
                         while(b[top]!='(')
                         {
                             printf("%c",b[top--]);
                         }
                         top--;
                     }
                     else
                         {
                             top++;//如果不是 就入栈
                             b[top] = c;                            
                         }
                 }
                 else //如果优先级比它低
                 {
                     if(b[top]!='(') //如果不是'(' 就把它(优先级高)出栈
                     {
                         printf("%c", b[top]);
                         b[top] = c;
                     }
                     else
                     {
                         top++;
                         b[top] = c;//如果是'(' 就直接入栈                        
                     }
                 }
                 
         
         }
             
     }
     while(top!=0) //判断栈是否为空 不为空就全部出栈
     {
         printf("%c",b[top]);
         top--;
     }
     printf("\n");
	 return 0;
 }
 
之前一直不能AC,是因为这一行
if(switc(c)>switc(b[top]))
之前我的代码是
if(switc(c)>=switc(b[top]))

这个等号是不能要的,原因是当两个元素元素的优先级是一样的时候,比如*和/,我们应该是先输出当前栈顶的元素,然后将其出栈,再将另一个优先级相同的元素入栈,输出,出栈。

举个栗子:
输入:(a+b)*c/e
错误输出:ab+ce/*
正确输出:ab+c*e/





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值