3-6 中缀表达式转换成后缀表达式

1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(214): warning C4602: #pragma pop_macro:“new”该标识符前面没有 #pragma push_macro
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(215): warning C4193: #pragma warning(pop) : 没有匹配的“#pragma warning(push)”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(216): warning C4161: #pragma pack(pop...) : 出栈的比入栈的多
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(23): error C2061: 语法错误: 标识符“abs”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(23): error C2059: 语法错误:“;”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(23): error C2061: 语法错误: 标识符“acos”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(23): error C2061: 语法错误: 标识符“asin”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(24): error C2061: 语法错误: 标识符“atan”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(24): error C2059: 语法错误:“;”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(24): error C2061: 语法错误: 标识符“atan2”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(24): error C2061: 语法错误: 标识符“ceil”
1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\cmath(25): error C2061: 语法错误: 标识符“cos”

若是switch单词写错了,则可能会出现上述错误。

输入1:

2+3*(7-4)+8/4#

输入2:

((2+3)*4-(8+2))/5#

 1 #include <iostream>
 2 #include <cctype>
 3 #include <stack>
 4 using namespace std;
 5
 6 int getPriority(char ch)
 7 {
 8     int priority = 0;
 9     switch(ch)
10     {
11         case ‘+‘:
12             priority = 1;
13             break;
14         case ‘-‘:
15             priority = 1;
16             break;
17         case ‘*‘:
18             priority = 2;
19             break;
20         case ‘/‘:
21             priority = 2;
22             break;
23         case ‘(‘:
24             priority = 3;
25             break;
26         default:
27             priority = 0;
28             break;
29     }
30     return priority;
31 }
32
33
34 int main()
35 {
36     std::stack<char> S;
37     char ch;
38     cin >> ch;
39     while (ch != ‘#‘)
40     {
41         while (isdigit(ch))
42         {
43             cout << ch;
44             cin >> ch;
45             if(!isdigit(ch))        //ch 不是数字且不是‘#‘, 表示完成了一个整型数据的输入,此时打印一个空格
46                 cout << " ";
47
48
49         }
50         if (ch == ‘#‘)
51             break;
52         if (ch == ‘)‘)                    //如果读入的字符是‘)‘,那么当栈顶元素不是‘(’时,一直输出栈顶元素
53         {
54             while (S.top() != ‘(‘)
55             {
56                 cout  << S.top()<< " ";
57                 S.pop();
58             }
59             S.pop();
60         }
61         else     //正常情况,将ch和栈顶字符比较优先级
62         {
63             while (!S.empty() && S.top() != ‘(‘ && getPriority(S.top()) >= getPriority(ch))
64             {
65                 cout << S.top()<< " " ;
66                 S.pop();
67             }
68             S.push(ch);
69
70         }cin >> ch;
71     }
72
73     while (!S.empty())
74     {
75         cout << S.top();
76         S.pop();
77         if (!S.empty())
78             cout << " ";
79     }
80
81     return 0;
82 }

原文地址:https://www.cnblogs.com/hi3254014978/p/9777420.html

时间: 2024-10-11 12:01:44

3-6 中缀表达式转换成后缀表达式的相关文章

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

中缀表达式转换成后缀表达式

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式.可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 20 4 #de

将中缀表达式转换成后缀表达式

中缀表达式(标准形式):A+(B-C/D+E)*F 后缀表达式(便于计算机计算):ABCD/-E+F*+ 本文使用栈来实现中缀表达式到后缀表达式的转换. 操作数:A B C D E F 操作符:+ - / * ( ) 操作符优先级:( )  >  / *  >  + - 逐个字符读取中缀表达式,结果不断输出,利用栈对操作符进行缓存: 1. 遇到操作数直接输出 2. 遇到操作符,如果此操作符优先级大于栈顶操作符,则将此操作符压栈,否则输出栈顶操作符:如遇到),则把栈内操作符依次弹出,直到(,()

表达式树—中缀表达式转换成后缀表达式(一)

算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出.5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈6.最终将栈中的元素依次出栈,输出.例如a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出:后缀表达式:a堆栈:空 遇到+:堆栈:空,所以+

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

八、通过中缀计算表达式转换成后缀计算表达式

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在通过栈对运算符号的入栈.出栈操作实现将中缀表达式转化成后缀表达式 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* n

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

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#

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

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

中缀表达式转换成前缀表达式和后缀表达式

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我