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 中缀表达式转换为后缀表达式的更多相关文章

  1. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  2. 练习3.20 a 将中缀表达式转换为后缀表达式

    //将中缀表达式转换为后缀表达式 int main() { ; ]={,,,,,,,}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); ) { ...

  3. 栈的应用实例——中缀表达式转换为后缀表达式

    声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...

  4. 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  5. 中缀表达式转换为后缀表达式(python实现)

    中缀表示式转换为后缀表达式 需要一个存放操作符的栈op_stack,输出结果的列表output 步骤: 从左到右遍历表达式: 1. 若是数字,直接加入到output 2. 若是操作符,比较该操作符和o ...

  6. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  7. NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. 中缀表达式得到后缀表达式(c++、python实现)

    将中缀表达式转换为后缀表达式的算法思想如下: 从左往右开始扫描中缀表达式 遇到数字加入到后缀表达式 遇到运算符时: 1.若为‘(’,入栈 2.若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'( ...

  9. 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...

随机推荐

  1. srping标签和hibernate查询

    Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. view层:    结合control层,显示 ...

  2. linux远程登录ssh免密码

    原文链接,感谢原作者. (一)问题: 假如我们现在有两台机器:ServerA和ServerB,现在想要让ServerA不用输入密码就能够进行访问. (二)方法和原理: 我们使用ssh-keygen在S ...

  3. Windows下怎么搭建Python+Selenium的自动化环境

    http://jingyan.baidu.com/article/47a29f244aec6bc014239985.html 注意点:配置了环境变量后需要重启电脑

  4. Python统计栏目页面数量

    主要为了装个B,统计栏目页面数量时候用的,多线程基本照抄 http://www.cnblogs.com/fnng/p/3670789.html 关于对SEO有什么用处...我觉得...仅对本人有用,P ...

  5. 腾讯应用开发3006 : name lookup timed out 错误

    昨天到今天发现应用访问不正常,用户发表数据很少,一查日志,QQ的 openApi 返回的结果全是 name lookup timed out,莫名其妙. 在服务器上 ping , nslookup , ...

  6. hdu1002

    //c//https://github.com/ssdutyuyang199401/hduacm/blob/master/1002.c#include<stdio.h>#include&l ...

  7. 【转】python - PyDev统一编码

    http://www.cnblogs.com/huangjacky/archive/2012/07/15/2592166.html 我们都知道Win7默认编码是GBK,而Ubuntu下面默认是utf- ...

  8. Zookeeper理解

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...

  9. Microsoft Visual Studio 2015 python 安装 mysql-python 出错解决

    Microsoft Visual Studio 2015 安装 python 连接包 mysql-python出错   第一种 pip安装方式 安装Microsoft Visual C++ Compi ...

  10. java中三大修饰符

    一.static 1.属性:类变量 定义在类以内,方法以外,全类有效,全类公共一个属性 类变量与创建对象无关,有默认值0 使用方式  类名.类变量     System.out.println(); ...