习题3.11 表达式转换(25 分)浙大版《数据结构(第2版)》题目集
Posted 给杰瑞一块奶酪~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题3.11 表达式转换(25 分)浙大版《数据结构(第2版)》题目集相关的知识,希望对你有一定的参考价值。
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
思路搞清楚就好,比较烦人有小数,有正负号,正好不用输出,负号要随数字输出,所以总的分为两块第一块是数字包括1-9和小数点,以及第一位就是正负的或者括号后面紧跟着正负,这些属于数字,第二类就是负号加减乘除以及括号,左括号要读入,在与他匹配的右括号出现之前,只输出左括号之后的负号,右括号出现,则抵消掉左括号继续输出。
代码:
#include <iostream> #include <map> #include <algorithm> #include <stack> using namespace std; void printk() { static int flag = 0; if(flag)cout<<‘ ‘; flag ++; } int main() { char s[50]; int c = 0; string a; cin>>a; map<char,int>p; p[‘*‘] = p[‘/‘] = 1; p[‘(‘] = p[‘)‘] = 2; for(int i = 0;i < a.size();i ++) { if((i < 1 || a[i - 1] == ‘(‘)&&(a[i] == ‘+‘ || a[i] == ‘-‘) || a[i] == ‘.‘ || a[i] >= ‘0‘ && a[i] <= ‘9‘) { printk(); if(a[i] != ‘+‘)cout<<a[i]; while(a[i + 1] == ‘.‘ || a[i + 1] >= ‘0‘ && a[i + 1] <= ‘9‘) { i ++; cout<<a[i]; } } else { if(a[i] == ‘)‘) { while(c && s[c - 1] != ‘(‘) { cout<<‘ ‘<<s[c - 1]; c --; } c --; while(c && s[c - 1] != ‘(‘) { cout<<‘ ‘<<s[c - 1]; c --; } } else if(!c || p[a[i]] > p[s[c - 1]]) { s[c ++] = a[i]; } else { while(c && s[c - 1] != ‘(‘) { cout<<‘ ‘<<s[c - 1]; c --; } s[c ++] = a[i]; } } } while(c) { cout<<‘ ‘<<s[c - 1]; c --; } cout<<endl; }
以上是关于习题3.11 表达式转换(25 分)浙大版《数据结构(第2版)》题目集的主要内容,如果未能解决你的问题,请参考以下文章
习题3.13 双端队列(25 分)浙大版《数据结构(第2版)》题目集
习题3.10 汉诺塔的非递归实现(25 分)浙大版《数据结构(第2版)》题目集
习题3.14 另类堆栈(15 分)浙大版《数据结构(第2版)》题目集
习题3.12 另类循环队列(20 分)浙大版《数据结构(第2版)》题目集