数据结构堆栈(中缀到后缀)

简介: 数据结构堆栈(中缀到后缀)

缀表达式:  a op b 形式的表达式。当运算符位于每对操作数之间时。

后缀表达式:  ab op 形式的表达式。当每对操作数都跟随一个运算符时。

为什么表达式的后缀表示?  

编译器从左到右或从右到左扫描表达式。

考虑下面的表达式: a op1 b op2 c op3 d

如果 op1 = +, op2 = *, op3 = +

编译器首先扫描表达式以计算表达式 b * c,然后再次扫描表达式以将 a 添加到它。然后在另一次扫描后将结果添加到 d。

重复扫描使其效率非常低。求值前最好将表达式转换为后缀(或前缀)形式。

后缀形式的对应表达式为abc*+d+。可以使用堆栈轻松评估后缀表达式。我们将在单独的帖子中介绍后缀表达式评估。

算法

1. 从左到右扫描中缀表达式。

2. 如果扫描的字符是操作数,则输出它。

3.  Else,  

3.1. 如果扫描的运算符的优先级大于堆栈中运算符的优先级(或堆栈为空或堆栈中包含 '(' ),则压入它

3.2. 否则,从堆栈中弹出所有优先级大于或等于扫描运算符的运算符。这样做之后,将扫描的操作符推入堆栈。(如果在弹出时遇到括号,则停在那里并将扫描的运算符压入堆栈。)

4. 如果扫描的字符是 '(',则将其压入堆栈。

5. 如果扫描的字符是 ')',弹出堆栈和输出它,直到一个“(”遇到,并丢弃两个括号。

6. 重复步骤2-6,直到缀表达式被扫描。

7. 打印输出

8. 从栈中弹出并且输出,直到它不是空的。

下面是上述算法的实现

#include<bits/stdc++.h>
using namespace std;
int prec(char c) {
  if(c == '^')
    return 3;
  else if(c == '/' || c=='*')
    return 2;
  else if(c == '+' || c == '-')
    return 1;
  else
    return -1;
}
void infixToPostfix(string s) {
  stack<char> st; 
  string result;
  for(int i = 0; i < s.length(); i++) {
    char c = s[i];
    if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))
      result += c;
    else if(c == '(')
      st.push('(');
    else if(c == ')') {
      while(st.top() != '(')
      {
        result += st.top();
        st.pop();
      }
      st.pop();
    }
    else {
      while(!st.empty() && prec(s[i]) <= prec(st.top())) {
        result += st.top();
        st.pop();
      }
      st.push(c);
    }
  }
  while(!st.empty()) {
    result += st.top();
    st.pop();
  }
  cout << result << endl;
}
int main() {
  string exp = "a+b*(c^d-e)^(f+g*h)-i";
  infixToPostfix(exp);
  return 0;
}

输出

abcd^e-fgh*+^*+i-
目录
相关文章
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
336 3
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
1645 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
算法 Java C语言
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
3533 1
|
存储 算法 C++
堆栈数据结构(介绍与程序)
堆栈数据结构(介绍与程序)
227 0
|
IDE 开发工具 Windows
数据结构——堆栈
时间过的真快呀,上次发文章还是在2月,上学之后很忙,现在肯定要将数据结构的内容尽快的更新完成,早日拿到专家博主。Stack叫栈,或者叫堆栈,这是一个很重点的概念,我将在这篇文章中举出很多的例子,让你能在生活中,windows系统发现那些叫做栈。
239 0
数据结构——堆栈
|
存储 Java 索引
21.从入门到精通:Python数据结构 列表 将列表当做堆栈使用 将列表当作队列使用 列表推导式 嵌套列表解析 del 语句
21.从入门到精通:Python数据结构 列表 将列表当做堆栈使用 将列表当作队列使用 列表推导式 嵌套列表解析 del 语句
|
算法 数据可视化 C语言
数据结构 | 后缀表达式【深入剖析堆栈原理】
数据结构之堆栈的应用中的后缀表达式讲解,层层递进,由浅入深,带你深刻理解后缀表达式
953 0
数据结构 | 后缀表达式【深入剖析堆栈原理】
|
存储 Java
数据结构(1)线性结构——数组、链表、堆栈、队列(介绍和JAVA代码实现)
1.1.线性表 线性表是指由同种元素构成的有序且线性的一种数据结构,由于其有序且线性的特点,可以抽象出对其的一个操作集:
220 0
数据结构 | 队列探究与学习、对比堆栈、队列存储实现
前言:上一篇我们讲解了堆栈相关的知识点,今天我们就对队列详细讲讲,并在此文中将其与堆栈进行适当对比,队列最主要的两个操作是什么呢,我们一起往下看吧 队列(Queue) 概念: 具有一定操作约束的线性表,插入和删除操作,只能在一端插入,而在另一端删除 堆栈也是受限的线性表,但它的插入和删除只在一端进行 数据插入:入队列(AddQ) 数据删除:出队列(DeleteQ) 先来先服务,先进先出(FIFO) 堆栈——先进后出 队列抽象数据类型描述 数据对象集:
数据结构 | 队列探究与学习、对比堆栈、队列存储实现

热门文章

最新文章