7-4 表达式转换(25 point(s))(栈的应用)
来源:互联网 发布:哪个校音器软件好用 编辑:程序博客网 时间:2024/06/06 13:11
7-4 表达式转换(25 point(s))
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +有很多坑,看注释,而且题目有误,/是除号,而不是\code:
#include <stdio.h>#include <string.h>int main(){ char a[30];//输入字符串 char s[30];//代表储存运算符号的栈 int top = -1; gets(a); int i; int flag = 0;//标记,看是不是第一个数字,是直接打出,不是先打出空格 for(i = 0; a[i]; i++){ if(a[i]>='0'&&a[i]<='9'){//如果是数字,直接打印出数字,包括多位的数字和小数 int j = i;//保存开头 while((a[i]>='0'&&a[i]<='9')||a[i]=='.')i++;//找到第一个不为数字的字符 i--;//回到最后一个数字字符上,因为for循环最后i++; int k; if(!flag||(a[j-1]=='-'&&(a[j-2]=='('||a[j-2]=='+'||a[j-2]=='-'||a[j-2]=='*'||a[j-2]=='/'))||(a[j-1]=='-'&&j-1==0)||(a[j-1]=='+'&&j-1==0)||(a[j-1]=='+'&&(a[j-2]=='('||a[j-2]=='+'||a[j-2]=='-'||a[j-2]=='*'||a[j-2]=='/')));//负数或者第一个数字,数字前不打空格,否则会和负号分开 else printf(" ");//这里是j千万别写成i,j记录的数字的开头 flag = 1; for(k = j; k <= i; k++)printf("%c",a[k]);//输出 } else{//如果是运算符 if(i==0&&(a[i]=='-'||a[i]=='+')){//开始的符号 if(a[i]=='-')printf("%c",a[i]); continue; } if(i==1&&a[i-1]=='('&&(a[i]=='-'||a[i]=='+')){//如果第一个是括号然后又是正负,坑死了这里,打死没想到 if(a[i]=='-')printf("%c",a[i]); continue; } if(top==-1){//如果栈为空,直接把运算符加进去 s[++top] = a[i]; } else{//入队原则:如果当前符号比栈顶优先级大,入栈,否则pop输出栈顶,再继续比较,直到比栈顶优先级大再入栈 if(a[i]=='+'||a[i]=='-'){//如果是加减号 if(a[i]=='-'&&a[i-1]=='('){//中间的负号 printf(" -"); continue; } if(a[i]=='+'&&a[i-1]=='('){//中加的加号 printf(" ");//如果有正号,不输出!!坑死 continue; } if((a[i]=='+'||a[i]=='-')&&(a[i-1]=='+'||a[i-1]=='-'||a[i-1]=='*'||a[i-1]=='/')){ if(a[i]=='-')printf(" %c",a[i]); if(a[i]=='+')printf(" ");//正号不输出 continue; } //if(s[top]=='*'||s[top]=='/'){//首先比较时第一个一定要比当前优先级大才开始出队。否则只能入队 while((top!=-1)&&(s[top]=='+'||s[top]=='-'||s[top]=='/'||s[top]=='*')){//比较如果栈内元素优先级大于当前符号。先出栈,直到比它大 printf(" %c",s[top--]); } //} s[++top] = a[i];//判断并出栈之后这个符号就可以入栈了 } else if(a[i]=='*'||a[i]=='/'){//如果是乘除号 while((top!=-1)&&(s[top]=='*'||s[top]=='/')){//因为乘除号是最高优先级,所以只有相等时需要出栈 printf(" %c",s[top--]); } s[++top] = a[i]; } else if(a[i]=='('){//左括号的时候比较特殊,直接入栈 s[++top] = a[i]; } else if(a[i]==')'){//右括号的时候直接出栈到左括号 while((top!=-1)&&s[top]!='(') printf(" %c",s[top--]); top--;//把左括号pop掉 } } } } //结束后栈内剩下的符号一次出栈输出即可 while(top!=-1){ printf(" %c",s[top--]); } return 0;}
阅读全文
0 0
- 7-4 表达式转换(25 point(s))(栈的应用)
- 7-10 树的同构(25 point(s))
- 7-10 树的同构(25 point(s))
- 6-7 Deque(25 point(s))
- 7-2 列车厢调度(25 point(s))(栈的经典题目)
- 表达式转换(25 分)(栈的应用)
- 栈的应用4--中缀表达式转换为后缀表达式
- 6-10 二叉树的遍历(25 point(s))
- 7-12 树种统计(25 point(s))(BST)
- 7-5 银行业务队列简单模拟(25 point(s))
- 7-8 List Leaves(25 point(s))
- 7-14 打印选课学生名单(25 point(s))
- 7-23 哥尼斯堡的“七桥问题”(25 point(s))
- 07-图4 哈利·波特的考试(25 point(s))
- 【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
- pat Data_stucture 表达式转换-栈的应用
- 栈的应用:后缀表达式到中缀表达式的转换
- 中序表达式转换成后序表达式问题(栈的应用)
- java:InputStream读取文件时出现中文乱码问题
- node.js使用fs的文件处理注意事项
- Server Tomcat v7.0 Server at localhost failed to start.错误原因
- 简图记录-linux进程的管理与调度
- Cocos2d-x 屏幕适配新解
- 7-4 表达式转换(25 point(s))(栈的应用)
- 对拍与一键编译
- 最大流模板
- 【二分图最大独立集】BZOJ4808[马]题解
- PHP文件操作---文件file
- 瀑布流
- 计算机操作系统 虚拟内存
- 7-5 银行业务队列简单模拟(25 point(s))
- 你可能不知道的javascript调试技巧