栈应用2-无括号后缀表达式

将算数表达式a+b+c*d转换成后缀表达式ab+cd*+,就可以利用栈来实现这种有优先级的运算,因此首先可以使用栈来将一种表达式转化成对应的后缀表达式。

下面是实现的转换算法,注意不能带括号,支持+-*/运算符,stack的实现我可以去掉了错误检测,因为默认已经声明好了足够大小的栈。

栈头文件stack.h

 1 /*数组栈*/
 2 #include "iostream"
 3 #include "stdlib.h"
 4
 5 #define  minSize 5
 6 #define  emptyStack -1
 7 #define  fullStack -2
 8 #define log(s); std::cout<<s<<std::endl;
 9
10 typedef struct _stack_
11 {
12     int capacity;
13     int topOfStack;
14     char *Array;
15 }stack;
16
17 stack *createStack(int maxSize)
18 {
19     stack *s;
20     if (maxSize < minSize)
21     {
22         return nullptr;
23     }
24     s = (stack *)malloc(sizeof(stack));
25     s->Array = (char *)malloc(sizeof(char) * maxSize);
26     s->capacity = maxSize;
27     s->topOfStack = emptyStack;/*初始化为空栈*/
28     return s;
29 }
30
31 int isEmpty(stack *s)/*是否为空栈*/
32 {
33     return s->topOfStack == emptyStack;
34 }
35
36 void push(stack *s, char data)/*压栈*/
37 {
38     ++s->topOfStack;
39     s->Array[s->topOfStack] = data;
40 }
41
42 void pop(stack *s)/*弹出栈*/
43 {
44     if (isEmpty(s))
45     {
46         return;
47     }
48     --s->topOfStack;
49 }
50
51 char top(stack *s)/*访问栈顶元素*/
52 {
53     if (isEmpty(s))
54     {
55         return emptyStack;
56     }
57     return s->Array[s->topOfStack];
58 }
59
60 void makeEmpty(stack *&s)/*置空栈*/
61 {
62     free(s->Array);
63     free(s);
64     s = nullptr;
65 }

主函数main.cpp

 1 #include "stack.h"
 2 #include "string"
 3
 4 int isSymbal(char s)
 5 {
 6     if (s == ‘+‘ || s == ‘*‘||s==‘-‘||s==‘/‘)
 7     {
 8         return 1;
 9     }
10     return 0;
11 }
12
13 int isBigger(char s1,char s2)//比较是否 s1不比s2 的优先级低
14 {
15     if (s1 == ‘*‘||s1==‘/‘)//*有最高优先级
16     {
17         return 1;
18     }
19     else
20     {
21         if (s2 == ‘*‘||s2==‘/‘)
22         {
23             return 0;
24         }
25         else
26             return 1;
27     }
28 }
29
30 int main(void)
31 {
32     stack *st = createStack(10);
33     std::string s;
34     std::cin >> s;
35     char i;
36     for (auto &i:s)
37     {
38         if (isSymbal(i))
39         {
40             if (isEmpty(st))//是空栈的时候
41             {
42                 push(st, i);
43             }
44             else//不是空栈的时候
45             {
46                 if (!isBigger(top(st), i))//栈顶的字符是否比较新读取的字符优先级不小
47                 {
48                     push(st,i);
49                 }
50                 else
51                 {
52                     std::cout << top(st) << " ";
53                     pop(st);
54                     push(st, i);
55                 }
56             }
57             continue;
58         }
59         std::cout << i << " ";
60     }
61     while (!isEmpty(st))
62     {
63         std::cout << top(st) << " ";
64         pop(st);
65     }
66     std::cout << "" << std::endl;
67     system("pause");
68     return 0;
69 }

我使用的结果是这样:

如有错误,请读者指出,不胜感激。

以上。

时间: 2024-08-12 06:44:10

栈应用2-无括号后缀表达式的相关文章

栈的应用 -- 无括号表达式的求值

package com.learn.algorithm.expression; import java.util.HashMap; import java.util.Map; import java.util.Stack; /** * 无括号表达式求值 * @author Jiekun.Cui * */ public class Expression { /** * 操作符的优先级定义 */ public static Map<String,Integer> optProirity = nul

【栈】洛谷P1449 后缀表达式

#include <iostream> #include <stack> using namespace std; int main(){ stack<int>s; char t; while(cin>>t && t != '@'){ //输入字符串t 当为@时结束 if( t>='0' && t<='9'){ //如果t是数字 int a = t - '0'; //那么先把t赋值给a while(cin>&

栈的典型实例问题——后缀表达式(逆波兰记号)的计算

//编译程序一般使用后缀表达式求解表达式的值(RPN或者逆波兰记号)//计算后缀表达式的过程为:扫描,如果该项是操作数,压栈:如果是操作符,则从栈中退出两个操作数(先退出的是右操作//数),进行运算,并将运算结果重新压入栈中,扫描完后栈顶存放的就是计算结果.//注意的地方:是否支持2位以上的操作数!//操作数之间也肯定是有分割符的: //比如:12 34 56 * + //如果是123456*+,不管是人还是计算机,都是没法做的: 1 #include<iostream> 2 #include

栈应用2-带括号后缀表达式

这次在原基础上添加了对于括号的支持,主要改进在如果碰到括号就将他压入栈中,同时具有最低优先级的输出(因为直到读取到了右括号左括号才被弹出). 主要代码如下,可以对照着上一篇随笔看,stack头文件是一样的. main.cpp 1 #include "stack.h" 2 #include "string" 3 4 int isSymbal(char s) 5 { 6 if (s == '+' || s == '*'||s=='-'||s=='/') 7 { 8 re

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

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

数据结构Java实现06----中缀表达式转换为后缀表达式 本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *.又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符

中缀表达式转换前\后缀表达式的总结

本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式.但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换. 不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的.但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选.堆栈是