后缀表达式

前缀、中缀、后缀表达式

ε祈祈猫儿з 提交于 2019-12-06 13:51:43
前缀、中缀、后缀表达式,它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。对计算机来说中缀表达式是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。 举例: (3 + 4) × 5 - 6 中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 前缀表达式的求值: 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 后缀表达式求值: 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。 来源: oschina 链接: https://my.oschina.net/u/2342105/blog/759022

栈和队列:面试题(Java)

孤者浪人 提交于 2019-12-06 07:04:28
文章目录 两个队列实现一个栈 两个栈实现一个队列 中缀表达式转后缀表达式 计算后缀表达式(逆波兰表达式) 深度优先遍历迷宫 广度优先遍历迷宫:找最短路径 两个队列实现一个栈 使用两个队列完成栈的功能, 思路 : 如上图,入队顺序为:1 2 3 4 5,如果要模拟栈的功能,那么就要上5先弹出来,因为是队列,所以只能从1开始出,把1 2 3 4存到另外一个队列中,这样就可以把5弹出来了: 这样就完成了一次出栈,这下上面的队列为空,所有的数据存储在下面这个队列中: 如果要继续出栈,那么就把1 2 3 挪到空的队列中,弹出4,到这里已经明白了如何模拟出栈,如何入栈呢,如果现在要入栈6,就直接跟到1 2 3 4的后面即可 这样出栈还是符合上面的规则,所以总结为两句话: 入栈时把数据入到有数据的那个队列中 出栈时把有数据的队列中的数据除过最后一个,其他都入队到另外一个队列,最后一个就是要出栈的元素 代码实现 : /** * 实现两个队列实现一个栈 */ public class StackQueue1 { private LinkedList < Integer > list1 ; private LinkedList < Integer > list2 ; public StackQueue1 ( ) { list1 = new LinkedList < > ( ) ; list2 =

课程设计

匿名 (未验证) 提交于 2019-12-03 00:30:01
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE 0 typedef int Status; typedef struct { char data[MAXSIZE]; int top; //栈顶位置 }Stack; //这个栈用来进行中缀转后缀过程中暂存运算符 typedef struct { float data[MAXSIZE]; int top; }ValueStack; //这个栈用来在后缀表达式求值时存放操作数 //1.栈的初始化 Status InitStack(Stack *s, int n){ if (n>MAXSIZE || n< 1 ){ printf ( "输入的长度有误!\n" ); return ERROR; } int i; for (i= 0 ;i<n;i++){ s->data[i] = 'a' ; } s->top = 0 ; return OK; } Status InitValueStack(ValueStack *v, int n){ if (n>MAXSIZE || n< 1 ){ printf ( "输入的长度有误!\n" ); return ERROR;

洛谷P1449 后缀表达式 题解 栈

匿名 (未验证) 提交于 2019-12-03 00:15:02
题目链接: https://www.luogu.org/problem/P1449 这道题目我们只需要开一个栈,每次读取到一个数的话就将这个数 push 进栈。 因为提供给我们的时候已经是一个后续序列了,所以能保证每次遇到一个符号的时候栈中至少有2个元素。 我们先从栈中取出一个元素,设为 \(a\) ;再从栈中取出一个元素,设为 \(b\) 。那么,对于符号来说: 如果它是 + ,那么将 \(b+a\) 的结果 push 进栈; 如果它是 - ,那么将 \(b-a\) 的结果 push 进栈; 如果它是 * ,那么将 \(b*a\) 的结果 push 进栈; 如果它是 / ,那么将 \(b/a\) 的结果 push 进栈。 最终能保证栈中只有一个元素,即栈顶元素,它就是我们后缀表达式的结果。 实现代码如下: #include <bits/stdc++.h> using namespace std; const int maxn = 1010; int n, c; char s[maxn]; stack<int> stk; int main() { cin >> s; n = strlen(s); n --; // 因为最后一个是 '@' int i = 0; while (i < n) { if (isdigit(s[i])) { c = 0; while (i < n &&

1.中缀表达式转后缀表达式

匿名 (未验证) 提交于 2019-12-03 00:05:01
package com.vi.stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * 将中缀表达式转成后缀表达式 * @author vi * */ public class InfixToSuffixDemo { public static void main(String[] args) { String expression = "1+((2+3)*4)-5"; //将表达式存储在List中 List<String> target = changeToList(expression); System.out.println(target); //开始转换 //s1运算符栈 Stack<String> s1 = new Stack<String>(); //s2 用list保存结果 List<String> s2 = new ArrayList<String>(); for(String item : target ) { //如果匹配到数字,存入s2 if(item.matches("\\d+")) { s2.add(item); } else{ //匹配是非数字,判断是否"(",左括号直接入栈 if("(".equals(item)) { s1.push

c++ 实现四则运算

匿名 (未验证) 提交于 2019-12-02 23:59:01
描述:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输出:计算结果,保留两位小数。 程序任务分为两部分: 一。将输入的中缀表达式转换为后缀表达式,实现过程:   1.准备队列保存后缀表达式(计算后缀表达式时,需要从队首读取数据)     准备栈保存计算符,使用找调整计算顺序       2.读输入字符串,如果是数字,直接入后缀表达式队列;     如果是计算符号,当计算符号栈为空或当前符号优先级大于栈顶符号优先级,直接入栈。否则依次弹出栈顶符号入后缀表达式队列。     如果是(直接入栈,如果是)弹出符号栈中符号入后缀表达式队列,直到((不入队)   3.反复2过程直到读完所有字符串,若符号栈不为空,弹出其中所有元素入队 二。计算后缀表达式:   计算栈   1.弹出队列元素,如果是数字,直接入栈,如果是操作符号,弹出栈顶两个数字计算。 P.S.第一个弹出数字是第二个数字,第二个弹出数字是第一个数字。     |--------|     |temp2|     |--------| 来源:博客园 作者: 水中飞云 链接:https://www.cnblogs.com/a-cloud---/p/11483901.html

后缀算术表达式

倖福魔咒の 提交于 2019-12-02 23:38:21
后缀表达式的特点如下: 1、后缀表达式的操作数与中缀表达式的操作数先后次序相同,而运算符的先后次序不同。 2、后缀表达式中没有括号,而且运算符没有优先级。 3、后缀表达式计算过程严格按照从左到右的顺序进行。 例如: 算术表达式a+(b-c)*d的后缀式是:abc-d*+ 在输入的时候出了问题: string s; cin>>s; 不能输入空格 所以要用getline getline(cin,s); 头文件 string 或者istream #include<iostream> #include<string> #include<istream> #include<cstring> #include<iomanip> using namespace std; typedef struct StackNode *LStack; struct StackNode { double nu; LStack next; }; void Init(LStack &s) { s = new StackNode; s = NULL; } void Pushnu(LStack &s, double c) { LStack p = new StackNode; p->nu = c; p->next = s; s = p; } void Pop(LStack &s) { LStack p; p = s;

中缀表达式转化为后缀表达式

不羁的心 提交于 2019-12-02 23:21:15
#include<iostream> #include<string> #include<cstring> using namespace std; typedef struct StackNode* LStack; struct StackNode { char data; LStack next; }; void InitStack(LStack &s) { s = NULL; } void Creat(LStack &s, char a) { LStack p = new StackNode; p->data = a; p->next = s; s = p; } void Pop(LStack &s) { LStack q; q = s; s = s->next; delete q; } char GetTop(LStack &s) { if (s == NULL) return NULL; return s->data; } int f(char s)//优先级 { int p; if (s == '*' || s == '/') p = 2; else if (s == '+' || s == '-') p = 1; return p; } int main() { string s; while (cin >> s && s != "=") { LStack q;

中缀表达式转后缀表达式,Java实现

匿名 (未验证) 提交于 2019-12-02 21:52:03
中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3+4),中缀表达式是人们常用的算术表示方法。 与前缀表达式(例:+34)或后缀表达式(例:34+)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。 例如: 例1:8 + 4 - 6 * 2 用后缀表达式表示为: 8 4 + 6 2 * - 例2:2 * ( 3 + 5 ) + 7 / 1 - 4 用后缀表达式表示为: 2 3 5 + * 7 1 / + 4 - ***百科的解【3 5 + 2 * 7 1 / 4 - +】是错误的,虽然结果正确但数字顺序一般不会变化 ――转自百度百科 中缀转后缀是如何转换的网上已经讲解的很详细了,本文不做赘述。 如果不理解的同学可以看: https://www.bilibili.com/video/av18586085/?p=20 代码实现: public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); // new一个栈 String[] array = "2 * ( 9 + 6 / 3 - 5 ) + 4".split(" "); // 中缀表达式 List<String> list =

洛谷P1449 后缀表达式 题解 栈

試著忘記壹切 提交于 2019-12-02 08:46:55
题目链接: https://www.luogu.org/problem/P1449 这道题目我们只需要开一个栈,每次读取到一个数的话就将这个数 push 进栈。 因为提供给我们的时候已经是一个后续序列了,所以能保证每次遇到一个符号的时候栈中至少有2个元素。 我们先从栈中取出一个元素,设为 \(a\) ;再从栈中取出一个元素,设为 \(b\) 。那么,对于符号来说: 如果它是 + ,那么将 \(b+a\) 的结果 push 进栈; 如果它是 - ,那么将 \(b-a\) 的结果 push 进栈; 如果它是 * ,那么将 \(b*a\) 的结果 push 进栈; 如果它是 / ,那么将 \(b/a\) 的结果 push 进栈。 最终能保证栈中只有一个元素,即栈顶元素,它就是我们后缀表达式的结果。 实现代码如下: #include <bits/stdc++.h> using namespace std; const int maxn = 1010; int n, c; char s[maxn]; stack<int> stk; int main() { cin >> s; n = strlen(s); n --; // 因为最后一个是 '@' int i = 0; while (i < n) { if (isdigit(s[i])) { c = 0; while (i < n &&