找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3988|回复: 2

中缀表达式转后缀表达式

[复制链接]

33

主题

1

回帖

561

积分

用户组: 大·技术宅

UID
580
精华
26
威望
28 点
宅币
341 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2014-12-8
发表于 2015-1-29 06:07:19 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
中缀表达式转后缀表达式

1 基本概念
    在计算机中表达式有三种,前缀表达式(波兰式),中缀表达式,后缀表达式(逆波兰式)。
如表达式:a+b*(c-d)-e/f
前缀表达式:-+a*b-cd/ef
中缀表达式:a+b*(c-d)-e/f
后缀表达式:abcd-*+ef/-
1.1 特点与利弊
    中缀表达式的括号必不可少,它的优点是符合我们人类的书写和读取习惯,但缺点是它不方便计算机处理。
    前缀和后缀表达式的缺点是不是我们阅读的习惯,但是它们却便于计算机的处理。比如针对后缀表达式来说,它是把操作数一直压入栈中,然后遇到一个操作符的时候,就从栈中取出两个数进行计算,再把得到的结果压入栈中。因此前缀和后缀是非常方便计算机处理的。
    现在考虑把中缀表达式转化为后缀表达式或者是从输入的中缀表达式转换为后缀表达式。
2 转换原理
    原理不难,我们遇到遇到操作数的时候直接输出,当遇到操作符(包括‘(’,‘+’,‘-’,‘*’,‘/’)的时候,我们需要把符号压入到栈中,
2.1 当遇到‘)’的时候:
    我们需要依次从栈顶弹出符号,直到遇到‘(’,并且要将‘(’弹出。如:(a*(b+c)),栈中的是(*(+,当遇到‘)’的时候,我们要弹出‘+’,‘(’。
2.2 当遇到‘(’的时候
    此时没什么要说的,直接压栈。
2.3 当遇到‘+’,‘-’,‘*’,‘/’的时候:
    我们要把栈顶元素的符号的优先级跟输入的符号的优先级进行对比,如果栈顶优先级高的话,我们就要把栈顶元素依次弹出,直到栈顶的优先级低于输入的优先级或者栈空。
如:a+b+c+d,跟a+b*c+d得到的符号顺序就不一样,原因就是这个优先级的问题。
2.4 当遇到操作数的时候:
    毫无疑问,直接输出
3 程序
  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;

  4. void changePosfix();
  5. int priorty(char ch);

  6. void main()
  7. {
  8.         changePosfix();
  9. }

  10. void changePosfix()
  11. {
  12.         stack<char> chStack;
  13.         char ch;
  14.         bool bg = false;
  15.         while( ch = getchar() )
  16.         {
  17.                 switch(ch)
  18.                 {
  19.                 case '(':
  20.                         chStack.push(ch);
  21.                         break;

  22.                 case ')':
  23.                         while( chStack.top() != '(' )
  24.                         {
  25.                                 cout<<chStack.top();
  26.                                 chStack.pop();
  27.                         }
  28.                         chStack.pop();
  29.                         break;

  30.                 case '+':
  31.                 case '-':
  32.                 case '*':
  33.                 case '/':
  34.                         //for example a+b*c+d,when meet last
  35.                         while( !chStack.empty() && priorty(chStack.top() )>=priorty(ch) )
  36.                         {
  37.                                 cout<<chStack.top();
  38.                                 chStack.pop();
  39.                         }
  40.                         // at last put ch in the end
  41.                         chStack.push(ch);
  42.                         break;

  43.                 case '\n':
  44.                         while( !chStack.empty() )
  45.                         {
  46.                                 cout<<chStack.top();
  47.                                 chStack.pop();
  48.                         }
  49.                         bg = true;
  50.                         break;

  51.                 default:
  52.                         cout<<ch;
  53.                 }
  54.                 if( bg )
  55.                         break;
  56.         }
  57. }

  58. inline int priorty(char ch)
  59. {
  60.         switch(ch)
  61.         {
  62.         case '+':
  63.         case '-':
  64.                 return 1;
  65.         case '*':
  66.         case'/':
  67.                 return 2;
  68.         default:
  69.                 return 0;
  70.         }
  71. }
复制代码

回复

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2015-2-17 17:52:37 | 显示全部楼层
哈哈哈哈,我写重了,我拿pb写了一个
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2015-2-17 17:55:13 | 显示全部楼层
可以试着做词法分析,解析变量,函数 运算符
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 13:25 , Processed in 0.040263 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表