中缀转后缀

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<stdbool.h>
  4 #include<ctype.h>
  5 #define MAXOP 100
  6 typedef struct SNode{
  7     char *Data;
  8     int Top;
  9     int Maxsize;
 10 }Stack;
 11
 12 Stack *CreateStack(int Maxsize)
 13 {
 14     Stack *S;
 15     S=(Stack *)malloc(sizeof(struct SNode));
 16     S->Top=-1;
 17     S->Data=(char *)malloc(Maxsize * sizeof(char));
 18     S->Maxsize=Maxsize;
 19     return S;
 20 }
 21
 22 bool IsFull(Stack *S)
 23 {
 24     return (S->Top==S->Maxsize-1);
 25 }
 26
 27 void Push(Stack *S,char op)
 28 {
 29     if(!IsFull(S))
 30     {
 31         S->Data[++(S->Top)]=op;
 32     }
 33 }
 34
 35 bool IsEmpty(Stack *S)
 36 {
 37     return (S->Top==-1);
 38 }
 39
 40 char Pop(Stack *S)
 41 {
 42     char op;
 43     if (!IsEmpty(S))
 44     {
 45         op=S->Data[(S->Top)--];
 46     }
 47     return op;
 48 }
 49 char Top(Stack *S)
 50 {
 51     char op;
 52     if (!IsEmpty(S))
 53     {
 54         op=S->Data[(S->Top)];
 55     }
 56     return op;
 57 }
 58
 59 typedef enum {num,opr,end}Type;
 60
 61 Type GetOp(char *Expr,int *start,char *str)
 62 {
 63     int i=0;
 64     while ((str[0]=Expr[(*start)++])==‘ ‘);
 65     while (str[i]!=‘ ‘ && str[i]!=‘\0‘)
 66     {
 67         str[++i]=Expr[(*start)++];
 68     }
 69     if (str[i]==‘\0‘)(*start)--;
 70     str[i]=‘\0‘;
 71
 72     if (i==0) return end;
 73     else if (isdigit(str[0])||isdigit(str[1])) return num;
 74     else return opr;
 75 }
 76
 77 int Prior(char op)
 78 {
 79     switch (op)
 80     {
 81         case ‘*‘:
 82         case ‘/‘: return 2;
 83         case ‘+‘:
 84         case ‘-‘: return 1;
 85         case ‘(‘: return 0;
 86     }
 87 }
 88
 89 void PrintPostfixExp(char *Expr)
 90 {
 91     int start=0;
 92     Type T;
 93     char str[MAXOP];
 94     char op1,op2;
 95     Stack *S;
 96     S=CreateStack(MAXOP);
 97     while((T=GetOp(Expr,&start,str))!=end)
 98     {
 99         if (T==num)printf("%s ",str);
100         else
101         {
102             switch(str[0])
103             {
104                 case ‘(‘:Push(S,str[0]);break;
105                 case ‘)‘:
106                 {
107                     while(Top(S)!=‘(‘)printf("%c ",Pop(S));
108                     Pop(S);
109                     break;
110                 }
111                 case ‘+‘:
112                 case ‘-‘:
113                 case ‘*‘:
114                 case ‘/‘:
115                 {
116                     if (IsEmpty(S)){Push(S,str[0]);break;}
117                     else
118                     {
119                         op1=Top(S);
120                         if (Prior(str[0])<=Prior(op1))printf("%c ",Pop(S));
121                         Push(S,str[0]);
122                     }
123                     break;
124                 }
125
126             }
127         }
128     }
129     while(!IsEmpty(S))printf("%c ",Pop(S));
130 }
131
132 int main()
133 {
134     char Expr[MAXOP];
135     gets(Expr);
136     PrintPostfixExp(Expr);
137     return 0;
138 }

时间: 2024-07-30 14:20:56

中缀转后缀的相关文章

【信息学奥赛一本通】第三部分_栈 ex1_4cale (中缀转后缀7符号)

其实这个中缀转后缀是费了很大功夫的,明白算法后第一次实现花了近三小时ORZ #include <stdio.h> #include <string.h> #include <ctype.h> char Mstr[511],Msta[511] = {'@'},Bstr[511]; int sta[511]; const short list[4][4] = {{0,-1,1,1},{1,0,1,1},{1,1,1,-2},{-1,-1,2,1}}; int level (

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计

将中缀转换为后缀并求值

一.中缀转后缀 中缀转后缀口诀: 1.遇到操作数,直接输出. 2.当栈为空时,遇到操作符直接入栈. 3.遇到左括号,将其入栈 4.遇到右括号,执行出栈,输出出栈的元素,直到弹出左括号,(左右括号不输出). 5.遇到运算符时,依次弹出所有优先级大于或等于该运算符的栈顶元素(到输出)然后将该元素入栈,否则直接入栈. 6.最终栈顶元素依次输出. 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+” 下面我们来具体看看这个过程. 1. 初始化一空栈,用来对符号进

[栈和队列]从中缀向后缀转换表达式

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define INIT_STACK_SIZE 100 5 typedef struct 6 { 7 char * chOperator; 8 int dwtop; 9 }OPND; 10 11 void InitStack(OPND *); 12 char Pop(OPND *); 13 void Push(OPND *,char );

栈的应用---中缀变后缀

中缀表达式 运算符号在数字中间 后缀表达式 运算符号在数字之后 计算机计算计算的是后缀表达式 中缀变后缀举例 5 + 3  ->  5 3 + 1 + 2 * 3  -> 1 2 3 * + 9 + (3 - 1) * 5 -> 9 3 1 - 5 * + 中缀变后缀算法 ···遍历中缀表达式中的数字和符号 ·········对于数字:直接输出 ·········对于符号: ······················左括号:进栈 ······················符号    

【C++】朝花夕拾——中缀转后缀

对于简单的四则运算而言,后缀表达式可以通过使用栈(stack)快速算出结果 ==================================我是分割线==================================== 后缀的定义: e.g. 2 + 3 -> 2 3 + 2 + 3 * 4 -> 2 3 4 * + 应用栈来计算后缀表达式: e.g. 后缀表达式 6 5 2 3 + 8 * + 3 + * 遍历:     6     push(6)            stack:

深入理解前缀、中缀、后缀表达式

1.我们首先来看一下,什么是前缀.中缀.后缀表达式: 中缀表达式: 2 - 3 * 4 后缀表达式:2 3 4 * - 前缀表达式:- 2 * 3 4 简单介绍下,前中后的划分依据为两个数字的操作符处于两个数字的前面,中间还是后面,其中中缀表达式为我们日常生活中常见的表达形式. 2.重要操作过程 后缀表达式求值过程: 从左到右扫描后缀表达式:遇到数字就将其压入栈中:遇到操作符,则取出栈顶的两个元素(栈顶元素为a, 另一个为b),并计算b 操作符 a的取值,并将结果重新压入栈中.扫描整个表达式结束

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

中缀试转后缀试及前缀试并计算其结果

1 /* 2 参考大神nb的代码,感觉思路不错!终于搞明白了!一开始不明白在计算表达式的时候,利用栈到底做了什么!现在感觉我们利用栈就是模拟我们书面上计算表达式, 3 将优先级高的运算先计算出来,然后放进栈中,等待下一次的计算 4 */ 5 #include<iostream> 6 #include<string> 7 #include<stack> 8 #include<cstdio> 9 using namespace std; 10 11 class

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右