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


 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 );
14 char GetTop(OPND);
15
16 char ComparePri(char op1,char op2);
17 void printStack(OPND);
18
19 char stringBuffer[128] = {‘\0‘};
20 char stringValue[128] = {‘\0‘};
21 int main()
22 {
23 OPND opnd;
24 int N = 0;
25 char ch ,*strValue,*strBuffer;
26 scanf("%d",&N);
27 getchar();
28 while(N--){
29
30 strValue = stringValue;
31 strBuffer = stringBuffer;
32
33 memset(stringValue,0,128*sizeof(char));
34 memset(stringBuffer,0,128*sizeof(char));
35
36 gets(stringBuffer);
37 InitStack(&opnd);
38 Push(&opnd,‘#‘);
39
40 ch = *strBuffer++;
41 while(ch != ‘#‘ || GetTop(opnd) != ‘#‘){
42 if((ch >= ‘a‘ && ch <= ‘z‘)||(ch >= ‘A‘ && ch <= ‘Z‘)) {
43 *strValue = ch;
44 strValue++;
45 ch = *(strBuffer++);
46 }
47 else
48 switch(ComparePri(GetTop(opnd),ch)){
49 case ‘<‘ : Push(&opnd,ch); ch = *(strBuffer++); break;
50 case ‘=‘ : Pop(&opnd); ch = *(strBuffer++); break;
51 case ‘>‘ : *strValue = Pop(&opnd); strValue++; break;
52 }
53 }
54 puts(stringValue);
55 }
56 return 0;
57 }
58 void InitStack(OPND *S)
59 {
60 S->chOperator = (char *)malloc(INIT_STACK_SIZE * sizeof(char));
61 if(!S->chOperator) exit(1);
62 S->dwtop = 0;
63 }
64 void Push(OPND *S,char ch)
65 {
66 *(S->chOperator + S->dwtop) = ch;
67 S->dwtop++;
68 }
69 char Pop(OPND *S)
70 {
71 S->dwtop--;
72 return *(S->chOperator + S->dwtop);
73 }
74 char ComparePri(char op1,char op2)
75 {
76 if((op1 == ‘+‘ || op1 == ‘-‘)&&(op2 == ‘*‘ || op2 == ‘/‘)) return ‘<‘;
77 else if((op1 == ‘(‘ && op2 == ‘)‘)||(op1 == ‘#‘ && op2 == ‘#‘)) return ‘=‘;
78 else if(op1 == ‘(‘ || op1 == ‘#‘ || op2 == ‘(‘) return ‘<‘;
79 else return ‘>‘;
80 }
81 void printStack(OPND opnd)
82 {
83 while(opnd.dwtop){
84 opnd.dwtop--;
85 printf("%c",*(opnd.chOperator + opnd.dwtop));
86 }
87 }
88 char GetTop(OPND opnd)
89 {
90 return *(opnd.chOperator + opnd.dwtop -1);
91 }

[栈和队列]从中缀向后缀转换表达式,码迷,mamicode.com

时间: 2024-11-03 21:01:11

[栈和队列]从中缀向后缀转换表达式的相关文章

数据结构之 栈和队列---算术表达式的转换(前缀+中缀+后缀)

算术表达式的转换 Time Limit: 1000MS Memory limit: 65536K 题目描述 小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下. 因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑.聪明的你帮他解决吧. 输入 输入一算术表达式,以\'#\'字符作为结束标志.(数据保证无空格,只有一组输入) 输出 输出该表达式转换所得到的前缀式 中缀式 后缀式.分三行输出,顺序

中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)

中缀表达式:就是我通常用的算术或逻辑公式: 后缀表达式:不包含括号,运算符放在两个运算对象后面,所有的计算按运算符出现的顺序,严格从左向右进行,不用考虑运算符优先级: 如,(2+1)*3 转换后,2 1 + 3 * 1.人工实现转换 如中缀表达式:a+b*c-(d+e) (1).按照运算符优先级对所有运算单位加括号,式子变成:((a+(b*c))-(d+e)) (2).把运算符号移动到对应括号后面,变成:((a(bc)*)+(de)+)- (3).把括号去掉就变成后缀表达式了:abc*+de+-

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 本题的测试点如下: 输入 输出 说明 2+3*(7-4)+8/4 2 3 7 4 - * + 8 4 / + 正常测试6种运算符 ((2+3)*4-(8+2))/5 2 3 + 4 * 8 2 + - 5 / 嵌套括号 1314+25.5*1

3-2-进制转换-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 进制转换(十进制转八进制) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

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

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

八、通过中缀计算表达式转换成后缀计算表达式

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在通过栈对运算符号的入栈.出栈操作实现将中缀表达式转化成后缀表达式 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* n

【信息学奥赛一本通】第三部分_栈 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 (