表达式转换(25 分)(栈的应用)
来源:互联网 发布:保湿水推荐 知乎 编辑:程序博客网 时间:2024/05/21 17:37
中缀式转后缀式
栈当中只保存了操作符
1.如果遇到操作数,直接输出。
2.如果遇到操作符,则将其压入到栈中,遇到左括号时也将其压入栈中。3.如果遇到一个右括号,则依次将栈顶元素弹出,并输出,直到遇到左括号为止。注意,左括号只弹出并不输出。
4.如果遇到任何其他的操作符,如("+", "*","(")等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。
弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下才弹出" ( ",其他情况都不会弹出" ( "。
5.弹出运算符时,遵循优先级高的优先弹出。在左括号压栈之前,其优先级最高,压栈之后,其优先级最低。
6.如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
注意:
1. 由于遇到运算数便立即输出了,所以栈当中便只保存了操作符,那么只需要判断其优先级从而确定输出的顺序即可
2. 运算数可能是正整数,负整数,小数(正负)
3. 负号只能是出现在开头或者是在中间的某一个'('之后
表达式转换(25 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include <stdio.h>#include <stdlib.h>#include <string.h>void print(){ static int flag = 0; if(flag) putchar(' '); flag++;}int main(){ char stack[50]; char str[50]; scanf("%s", str); int len = strlen(str); int top = 0;//压栈之后top++,所以每一次top都是栈顶的下一个位置 for(int i = 0; i<len; i++){ //处理运算数(此处的+ -表示正负,而非加减 if((str[i] == '+' || str[i] == '-') && (!i || str[i - 1] == '(') || (str[i] >= '0' && str[i] <= '9')){ print(); if(str[i] != '+') putchar(str[i]); while(str[i + 1] == '.' || (str[i + 1] >= '0' && str[i + 1] <= '9')) putchar(str[++i]); } else{ //处理运算符 if(str[i] == ')'){//遇到右括号,则需要将左括号前的运算符全部弹栈输出 while(top && stack[top-1] != '('){ print(); putchar(stack[--top]); } //如果栈不为空 if(top) --top; //左括号只弹栈,不输出 } else{ if(!top){ //栈为空,无须比较,直接压栈 stack[top++] = str[i]; continue; } //根据优先级顺序,压栈||(弹栈后压栈) while(top && stack[top-1] != '('){ //比较优先级,如果str[i]的优先级大于栈顶运算符的优先级,直接压栈 if(str[i] == '(' || ((str[i] == '*' || str[i] == '/') && (stack[top-1] == '-' || stack[top-1] == '+'))) break; print(); //如果str[i]的优先级小于栈顶的优先级,弹栈,之后再把str[i]压栈 printf("%c", stack[--top]); } stack[top++] = str[i]; } } } while(top){ //所有运算数均已操作完毕,最后将栈中剩余的操作符全部输出 print(); //左括号不输出 if(stack[top-1] != '(') putchar(stack[--top]); else top--; } return 0;}
这个题被“=” 和“==”坑惨了o(╥﹏╥)o
阅读全文
0 0
- 表达式转换(25 分)(栈的应用)
- 7-4 表达式转换(25 分)
- pta 5-8 表达式转换 (25分) (栈)
- 【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
- 7-4 表达式转换(25 point(s))(栈的应用)
- pat Data_stucture 表达式转换-栈的应用
- 栈的应用:后缀表达式到中缀表达式的转换
- 5-20 表达式转换 (25分)
- 5-20 表达式转换 (25分)
- 5-20 表达式转换 (25分)
- 5-1 表达式转换 (25分)
- 5-2 表达式转换 (25分)
- 中序表达式转换成后序表达式问题(栈的应用)
- 中序表达式转换成后序表达式问题(栈的应用)
- 栈的应用之中缀表达式转换为后缀表达式
- 栈的应用4--中缀表达式转换为后缀表达式
- 5-21 求前缀表达式的值(25分)
- 7-21 求前缀表达式的值(25 分)
- 台阶问题(1or2)
- 读《批判性思维》续
- leetcode 406. Queue Reconstruction by Height 人群高度排序
- C++命名空间 namespace的作用和使用解析
- 一个32岁入门的70后程序员给我的启示
- 表达式转换(25 分)(栈的应用)
- 使用logstash输出到elasticsearch中文乱码的解决方案
- 十个Chatbot框架介绍
- 课程小结——SURF特征提取
- 选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值)
- 《算法笔记》C++ 进制转换
- java学习 java -- 代码块 继承
- 剑指offer — 二叉树与双向链表
- 实验一