/**************************************** 栈的一个应用表达式求值 写者:颜清国 06.3.20****************************************/#include "stdio.h"#include "string.h"#define MAX 100typedef struct sstack{ char str[MAX]; int top;}stack;/*入栈操作*/void push(stack *ta,char p){ ta->top++; ta->str[ta->top]=p;}/*出栈,返回栈顶的值*/char pop(stack *ta){ char temp; if(ta->top==-1)/*栈已经空*/ { printf("stack is empty!"); return 0; } else { temp=ta->str[ta->top]; ta->top--; } return temp;}/*输出栈*/void dispstack(stack ta){ int i=0; if(ta.top==-1)/*栈已经空*/ { printf("stack is empty!"); return; } printf("the stack elem are:"); for(;i< ta.top;i++) { printf("%c -----> ",ta.str[i]); } printf("%c",ta.str[ta.top]);}/******************************将中缀表达式转化为后缀表达式*******************************/ void trans(char mid[],char last[]){ stack temp;/*临时栈,用来调整成后缀表达式*/ int lm=0,la=0,len=strlen(mid); temp.top=-1; /*初始栈为空*/ push(&temp,'(');/*整个表达式要加上括号*/ while(lm < len) { switch(mid[lm]) { case '-': /*'+''-'转化时,'('前的OP均出栈*/ case '+': /*注意必须先将整个表达式要加上括号*/ while(temp.str[temp.top]!='(') { last[la++]=pop(&temp); last[la++]='#'; /*加上'#'分隔符*/ } push(&temp,mid[lm]);/*自己入栈*/ break; case '*': case '/': while((temp.str[temp.top]=='*') ||(temp.str[temp.top]=='/')) { last[la++]=pop(&temp);/*栈顶是'*','/'则出栈*/ last[la++]='#'; /*加上'#'分隔符*/ } push(&temp,mid[lm]); /*自己入栈*/ break; case '(': push(&temp,'('); /*是'('直接入栈*/ break; case ')': while(temp.str[temp.top]!='(') { last[la++]=pop(&temp); /*将'('前所有OP出栈*/ last[la++]='#'; } pop(&temp); /*将'('出栈,自己不入栈*/ break; default: if((mid[lm] > '0')&&(mid[lm] <= '9'))/*可以屏蔽其它字符*/ { while((mid[lm] > '0')&&(mid[lm] <= '9')) { last[la++]=mid[lm++]; /*是数字保存到字串中*/ } last[la++]='#'; /*数字之间用分隔符隔开*/ lm--;/*需要退回来*/ } break; } lm++; /*依次扫描待转换的字串*/ } while(temp.top > 0) /*第0个元素为'(',不用保存*/ { last[la++]=pop(&temp); last[la++]='#'; } last[la]='\0'; /*标志后缀表达式结束*/}int result(char str[]){ int temp[50],top=0,total=0; int i=0,len=strlen(str); while(i < len) { switch(str[i]) { case '+': temp[top-1]=temp[top-1] + temp[top]; /*相加*/ top--; /*下标减1*/ break; case '-': temp[top-1]=temp[top-1] - temp[top]; /*相加*/ top--; /*下标减1*/ break; case '*': temp[top-1]=temp[top-1] * temp[top]; /*相加*/ top--; /*下标减1*/ break; case '/': temp[top-1]=temp[top-1] / temp[top]; /*相加*/ top--; /*下标减1*/ break; default: total=0; while(str[i]!='#') { total=total*10 + str[i]-'0'; i++; } top++; temp[top]=total; i--; break; } i=i+2; /*去掉'#'号*/ } return temp[1];}void main(){ char str[100],str2[100]; printf("please in put the expression:"); gets(str); trans(str,str2); printf("\nthe result is %d:",result(str2)); getch();}
分享到:
相关推荐
本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+"、减号"-"、乘号"*"和除号"/")以及括号用于改变运算顺序。...
同时,理解中缀表达式的求值也为理解编译器的工作原理提供了一个基础。 参考文献: [1] 数据结构教程,作者:XXX [2] C语言程序设计,作者:XXX [3] 计算机算法基础,作者:XXX 本实验报告详细介绍了如何利用栈...
"用栈的应用编一个表达式求值的程序(c语言)" 这篇代码实现了一个使用栈来计算数学表达式的值的程序。该程序使用了两个栈,一个用于操作符(OPTR),另一个用于操作数(OPND)。程序通过读取输入的表达式,使用栈...
### 数据结构栈实现表达式求值 #### 一、引言 在计算机科学领域,数据结构是存储和组织数据的一种特殊方式,它不仅能够提高算法的效率,还能够简化复杂问题的解决过程。栈是一种非常重要的线性数据结构,遵循后进先...
在解析和求值一个算术表达式时,我们可以根据不同的场景选择使用一个或两个栈。通常情况下,我们会用一个栈来存储运算符,另一个栈来存储操作数。 1. **初始化栈**:首先创建两个栈,一个用于存放运算符(`stack1`...
基于栈的算术表达式求值算法是一种常见的计算方法,主要应用于解决逆波兰表示法(Reverse Polish Notation,RPN)或中缀表达式的求值问题。本实验旨在让学生掌握栈这种数据结构的定义和实现,并能利用栈解决实际问题...
5. **结束条件**:当所有字符都处理完毕并且操作符栈中只剩下一个结束标志`#`时,表达式的求值过程结束。 6. **返回结果**:最终,操作数栈中将仅剩一个元素,即表达式的计算结果。 #### 示例代码分析 根据给定的...
本主题将深入探讨如何使用C++语言和栈数据结构来实现一个简单的四则运算表达式求值器。首先,我们需要理解表达式求值的基本原理,然后介绍C++中的栈操作,最后通过具体的代码示例展示如何实现这个功能。 ### 表达式...
* 读取下一个字符:ReadNextCh 算法用于读取下一个字符,用于实现表达式的解析。 * 因子算法:factor 算法用于实现表达式的解析,例如识别数字和操作符,并对其进行处理。 * 建立栈:建立栈用于存放操作字符和数据,...
本文将详细介绍如何利用两个栈(一个字符栈和一个数字栈)来计算表达式的值。 #### 一、基本概念 在介绍具体的实现方法之前,我们先来了解一下栈的基本概念以及与本问题相关的几个关键点。 - **栈**:栈是一种...
实验的主要目标是掌握数据结构中的栈与队列的应用,特别是如何利用栈来解决中缀表达式的求值问题。在这个实验中,学生需要从键盘接收输入的中缀表达式,然后通过堆栈来计算并输出表达式的求值结果。 基础要求是实现...
在本主题中,我们将深入探讨栈在表达式求值中的应用,这是数据结构课程中的一个经典问题。 栈在表达式求值中的作用主要体现在两个方面:括号匹配和算术运算的计算。首先,我们需要理解表达式的两种形式:中缀表达式...
数据结果,C语言表达式求值,堆栈经典应用。输入表达式,如1+2*3,输出运算后的值。
在本项目中,我们将探讨如何利用C语言的数据结构——栈,来实现表达式的求值。栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,非常适合处理具有运算顺序的计算问题,如数学表达式的求值。 首先,...
以下是一个基本的表达式求值算法步骤: 1. 从左到右遍历表达式。 2. 如果遇到操作数,直接压入栈中。 3. 如果遇到运算符,与栈顶运算符比较优先级: - 如果栈为空,或者当前运算符优先级高于/等于栈顶运算符,将...
本项目聚焦于栈在解决特定问题中的应用,即如何使用栈来求解中缀表达式的值。中缀表达式是我们日常生活中最常见的数学表达式形式,如2 + 3 * 4。然而,在计算机处理这种表达式时,由于没有明确的优先级和运算顺序,...
在我们的程序中,我们可能需要实现一个解析器来将输入的中缀表达式转换为后缀表达式,然后用栈数据结构来执行求值。 栈是一种LIFO(后进先出)的数据结构,非常适合处理表达式的计算。当我们遇到一个操作数时,将其...
通过以上步骤,我们可以实现一个后缀表达式求值的程序,它能有效地计算出任何有效的后缀表达式的值。这种算法在计算机科学和编程中被广泛应用,特别是在编译器设计和解析表达式时。了解并掌握后缀表达式及其求值方法...
要实现一个能够处理带有算符优先级的算术表达式求值的算法,我们首先需要理解算术表达式的结构以及算符的优先级规则。算术表达式由数字、算符(如加、减、乘、除等)组成,而这些算符有不同的优先级。例如,在表达式...
采用栈和队列数据结构及C++程序设计语言实现中缀表达式求值#数据结构实验#栈和队列应用#C++程序设计语言