Infix to postfix conversion 中缀表达式转换为后缀表达式
Conversion Algorithm
1、操作符栈压入"#";
2、依次读入表达式的每个单词;
3、如果是操作数则压入操作数栈;
4、如果是操作符,则将操作符栈顶元素与要读入的操作符进行优先级比较
(4.1)如果读入的是 ')',则将操作符栈中的元素压入操作数栈直至遇到 '(';
(4.2)如果读入的是 '(',压入操作符栈;
(4.3)如果栈顶元素优先级低,压入操作符栈;
(4.4)如果读入的元素不为'#',以及栈顶元素优先级高,则将栈顶元素压入操作数栈,将读入的元素压入操作符栈;
(4.5)如果操作符栈为空或操作符栈栈顶元素为 '(',压入操作符栈;
(4.6)其他,将操作符栈元素压出到操作数栈直至遇到'#';
5.将操作数栈元素逆序输出。
- //infix to postfix
- #include<iostream>
- #include<vector>
- using namespace std;
- struct Node
- {
- char data;
- Node* next;
- };
- class LinkStack
- {
- public:
- LinkStack()
- {
- top = new Node;
- top = NULL;
- }
- ~LinkStack()
- {
- delete top;
- }
- void push(char item);
- void pop();
- char front() const;
- void display()const;
- private:
- Node*top;
- };
- void LinkStack::display()const
- {
- Node*p = top;
- vector<char>s = {};
- while (p != NULL)
- {
- s.push_back(p->data);
- p = p->next;
- }
- vector<char>s1 = {};
- vector<char>::size_type size = s.size();
- for (vector<char>::size_type i = 0; i < size; i++)
- s1.push_back(s[size - 1 - i]);
- for (auto i : s1)
- cout << i;
- cout << endl;
- }
- void LinkStack::push(char item)
- {
- Node*p = new Node;
- p->data = item;
- p->next = top;
- top = p;
- }
- void LinkStack::pop()
- {
- Node*p = top;
- top = top->next;
- delete p;
- }
- char LinkStack::front()const
- {
- return top->data;
- }
- bool isNum(char c)
- {
- return (c <= '9' && c >= '0');
- }
- char Precede(char f, char c)
- {
- if (f == '+')
- {
- if (c == '*' || c == '/' || c == '(')return '<';
- else return '>';
- }
- else if (f == '-')
- {
- if (c == '*' || c == '/' || c == '(')return '<';
- else return '>';
- }
- else if (f == '*')
- {
- if (c == '(')return '<';
- else return'>';
- }
- else if (f == '/')
- {
- if (c == '(')return '<';
- else return'>';
- }
- else if (f == '(')
- {
- if (c == ')')return '=';
- else return '<';
- }
- else if (f == ')')return '>';
- else if (f == '#')
- {
- if (c == '#')return '=';
- else return '<';
- }
- }
- void evaluate(LinkStack*SOPTR, LinkStack*SOPND)
- {
- SOPTR->push('#');
- char c;
- while (cin >> c)
- {
- if (isNum(c))
- {
- SOPND->push(c);
- }
- else
- {
- if (c == ')')
- {
- char c1 = SOPTR->front();
- while (c1 != '(')
- {
- SOPND->push(c1);
- SOPTR->pop();
- c1 = SOPTR->front();
- }
- SOPTR->pop();
- }
- else if (c == '(')
- SOPTR->push(c);
- else if (Precede(SOPTR->front(), c) == '<')
- {
- SOPTR->push(c);
- }
- else if (c!='#'&&Precede(SOPTR->front(), c) == '>')
- {
- char cha = SOPTR->front();
- SOPTR->pop();
- SOPTR->push(c);
- SOPND->push(cha);
- }
- else if (SOPTR->front() == '#' || SOPTR->front() == '(')
- {
- SOPTR->push(c);
- }
- else
- {
- char ch = SOPTR->front();
- while (ch != '#')
- {
- SOPND->push(ch);
- SOPTR->pop();
- ch = SOPTR->front();
- }
- }
- }
- }
- SOPND->display();
- delete SOPND, SOPTR;
- }
- int main()
- {
- cout << "input the infix expression:(you must input # to stop input)" << endl;
- LinkStack* SOPTR = new LinkStack;
- LinkStack* SOPND = new LinkStack;
- evaluate(SOPTR, SOPND);
- return 0;
- }
Infix to postfix conversion 中缀表达式转换为后缀表达式的更多相关文章
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- 练习3.20 a 将中缀表达式转换为后缀表达式
//将中缀表达式转换为后缀表达式 int main() { ; ]={,,,,,,,}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); ) { ...
- 栈的应用实例——中缀表达式转换为后缀表达式
声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...
- 数据结构Java实现06----中缀表达式转换为后缀表达式
本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
- 中缀表达式转换为后缀表达式(python实现)
中缀表示式转换为后缀表达式 需要一个存放操作符的栈op_stack,输出结果的列表output 步骤: 从左到右遍历表达式: 1. 若是数字,直接加入到output 2. 若是操作符,比较该操作符和o ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...
- 中缀表达式得到后缀表达式(c++、python实现)
将中缀表达式转换为后缀表达式的算法思想如下: 从左往右开始扫描中缀表达式 遇到数字加入到后缀表达式 遇到运算符时: 1.若为‘(’,入栈 2.若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'( ...
- 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)
题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...
随机推荐
- Linux下各类压缩文件命令小结
.tar 解包:tar xvf FileName.tar 解包后原始文件仍存在 打包:tar cvf FileName.tar DirName1 Filename1 - 列出内容:tar tvf ...
- Linux操作系统信息查看命令
1. 查看系统内核信息 uname -a 2. 操作系统版本 cat /etc/issue | grep Linux 3. 查看CPU型号 cat /proc/cpuinfo | grep name ...
- hdu1025
#include<stdio.h>const int MAXN=500010;int a[MAXN],b[MAXN]; //用二分查找的方法找到一个位置,使得num>b[i-1] 并 ...
- hdu1022
#include <stdio.h>#include <string.h> int main(void){ int n,i,j,k,l; char o1[10],o2[10], ...
- Html网页的代码
Html网页的代码 很全哦 1)贴图:<img src="图片地址"> 2)加入连接:<a href="所要连接的相关地址">写上你想写 ...
- MVC写在Model文件夹下,登录注册等页面定义的变量规则,不会被更新实体模型删除
一下图为我的model文件夹
- 《JS权威指南学习总结--6.8对象的三个属性》
内容要点: 每一个对象都有与之相关的原型(prototype).类(class)和可扩展性 一.原型属性 1.对象的原型属性是用来继承属性的,这个属性是如此重要,以至于我们经常把 "0的原型 ...
- button,input type=button按钮在IE和w3c,firefox浏览器区别
在项目中遇到一个问题,是关于点击button按钮会自动刷新的问题.查阅了资料,做以下的整理: button,input type=button按钮在IE和w3c,firefox浏览器区别如下:当在IE ...
- oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系
前言:在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后 ...
- WiMAX协议栈
1.协议栈模型 协议栈模型将 WiMAX 系统分为数据控制平面和管理平面两个平面 数据控制平面对数据的正确传输进行保证,包括封装.分片.加密.解封装等 基站与用户站之间的特定信令交互完成系统的控制功能 ...