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. Java中获取当前日期

    java.util.Date date = new Date();java.Text.SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd ...

  2. 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  3. C#打印

    public partial class Form1 : Form { PrintDocument printDocument; StringReader lineReader = null; pub ...

  4. 整合改造百度编译器到thinkphp上传图片到OSS

    oss上传类库,放到public下,放到extend下,实例化是报错找不到上传类(我不知道为什么).

  5. 基于HTML5 的WebSql本地设备数据库

    HTML5 的 Web SQL Database 用本地和会话存储实现简单的对象持久化,对繁琐的关系数据进行处理. 在 W3C 的 Web SQL Database 规范中(参照 介绍)有这样的描述: ...

  6. js数组对象方法

  7. UITextField(一)监听输入内容的变化(开发笔记)

    //添加事件UIControlEventEditingChanged [textField addTarget:self action:@selector(textFieldDidChange:) f ...

  8. L3-002. 堆栈

    L3-002. 堆栈 题目链接:https://www.patest.cn/contests/gplt/L3-002 线段树 线段树的数据修改和查询都是O(lgn)的,此题只需维护各个区间内的数的个数 ...

  9. [jquery备忘]

    has :包含,找元素里面的子元素(单个) <div><span>123</span></div> $('div').has('span').css() ...

  10. HDU1789Doing Homework again(贪心)

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...