/**************************************** 栈的一个应用表达式求值 写者:颜清国 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();}
分享到:
相关推荐
该程序很好实现了算术表达式求值,支持+、-、*、/,以=结束,符合正常表达式。
数据结构栈实现表达式求值数据结构栈实现表达式求值数据结构栈实现表达式求值数据结构栈实现表达式求值
用栈的应用编一个表达式求值的程序(c语言)
只是任意位数表达式的求值!运用栈的技术!轻松实现! 只是任意位数表达式的求值!运用栈的技术!轻松实现! 只是任意位数表达式的求值!运用栈的技术!轻松实现!
C++实现表达式求值 本实验要求设计一个算术表达式求值的程序,该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=ab )的中缀表达式,并求出结果。如果表达式正确,则输出表达式的结果;如果表达式非法...
实验内容及要求: 从键盘输入中缀表达式,建立操作数与运算符堆栈,计算并输出表达式的求值结果。 基本要求:实现 +, -, *, /四个二元运算符以及();...实验目的:掌握堆栈在表达式求值中的应用。
数据结果,C语言表达式求值,堆栈经典应用。输入表达式,如1+2*3,输出运算后的值。
数据结构 栈的应用举例 表达式求值 经典解法
采用栈和队列数据结构及C++程序设计语言实现中缀表达式求值#数据结构实验#栈和队列应用#C++程序设计语言
栈和应用_表达式求值.doc
本程序利用两个栈——一个符号栈一个数字栈,实现了中缀表达式的计算,代码风格是C++,运行平台是QT,欢迎大家下载参考。
实验步骤与源程序 实验步骤 我先从具体的问题中抽象出适当的数学模型,然后设计出相应的算法,其中,需要设 计一个函数来求后缀表达式,设计另外一个函数来求后缀表达式的值,最后,编写主函 数,串接程序,并调试...
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。...
本例的思想方法是利用栈进行操作,设有两个栈,一个符号,一个数字栈!用户输入算术表达式后,对其进行解析,经将数字入数字栈,符号入符号,若要入栈的优先级第低于栈顶的元素的符号,则将栈顶符号出栈,经数字栈出...
数据结构利用栈的两种方法计算表达式求值 c语言版 原本代码 可以直接下载运行 纯原创作 可满足数据结构作业或者实验报告 也可以熟悉栈的应用···
长沙理工大学数据结构栈的实现与应用算术表达式求值实验报告.doc
要求以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算术符优先关系,实现对算数四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作符栈、输入字符和主要操作的变化过程。
表达式求值是程序设计语言编译中的一个最基本问题,它的实现是栈应用的一个典型例子. 搞了一天,有相关的好的算法请大家传上来,一起分享.
数据结构中关于栈的应用,输入算数表达式,然后进行求解
此程序先将输入的中缀表达式转化为后缀表达式,然后计算后缀表达式的值,此为栈的应用。