一、从原表达式求得后缀式
表达式存放在字符型数组str中,其后缀表达式存放在字符型数组exp中,转换过程中用一个字符型数组op作为栈。依次处理字符串str中的每个字符ch,对于每一个ch:
(1)若ch为数字,将其存放在exp中。
(2)若ch为左括弧“(”,将其压栈。
(3)若ch为右括弧“)”,将栈op中“(”上面的操作符出栈并依次存入exp中,然后“(”出栈。
(4)若ch为“+”或“-”,将op中“(”上面的所有字符(运算符)依次出栈并存入exp中,然后将ch入栈op中。
(5)若ch为“*”或“/”,将op中的栈顶连续的“*”或“/”出栈并依次存入exp中,然后将ch入栈op中。
(6)若str扫描完毕,将op中的所有运算符依次删除并存入exp中,再将ch(结束标志)存入数组exp中。
#include <iostream> #include <conio.h> #define MaxSize 10 typedef struct{ char data[MaxSize]; //存放运算符 int top; //栈的最高位置 }Stack; void trans (const char *str, char *exp){ Stack op; char ch; int s=0, e=0; //e作为exp的下标, s作为str的下标 op.top=-1; ch=str[s]; s++; while (ch!='\0'){ //扫描字符串 switch(ch){ case '(': //将ch压栈 op.top++; op.data[op.top]=ch; break; case ')': //将op中(上面的数据依次复制到exp中 while (op.data[op.top]!='('){ exp[e]=op.data[op.top]; op.top--; e++; } op.top--; //(出栈 break; case '+': case '-': //前面的运算必定都算完才算当前加减,故将栈中(前面的都出栈到exp中 while (op.top!=-1 && op.data[op.top]!='('){ exp[e]=op.data[op.top]; op.top--; e++; } op.top++; op.data[op.top]=ch; break; case '*': case '/': //前面的乘除必定都算完才算当前乘除,故将栈连续的乘除都出栈到exp中 while (op.top!=-1 && op.data[op.top]=='*' || op.data[op.top]=='/') { exp[e]=op.data[op.top]; op.top--; e++; } op.top++; op.data[op.top]=ch; break; case ' ': break; //过滤掉空格 default: while (ch>='0' && ch<='9'){ //判定为数字 exp[e]=ch; e++; ch=str[s]; s++; } s--; exp[e]='#'; //用#标识一个数值串结束 e++; } //switch ch=str[s]; s++; } //while while (op.top!=-1) { //str扫描完毕,栈不空 exp[e]=op.data[op.top]; e++; op.top--; } exp[e]='\0'; //exp结束标识 } int main(){ char *str="(5+6*5)+9/(5+6*5)"; // char *exp; char exp[20]=""; std::cout<<str<<std::endl; trans(str,exp); std::cout<<exp<<std::endl; getch(); return 1; }
运行结果:
(5+6*5)+9/(5+6*5)
5#6#5#*+9#5#6#5#*+/+
二、后缀表达式求值
从左到右读入后缀表达式,若读入的是一个操作数,就将它入数值栈;若读入的是一个运算符op,就从数值栈中连续出栈两个元素(两个操作数),假设为x和y,计算x op y之值,并将计算结果入数值栈;对整个后缀表达式读入结束时,栈顶元素就是计算结果。
#include <stdio.h> #include <stdlib.h> #define MaxSize 20 typedef struct { float data[MaxSize]; //存放数值 int top; //栈指针 }Stack; float compvalue(char *exp){ //计算后缀表达式的值 Stack st; int d; char ch; int e=0; //e作为exp的下标 st.top=-1; ch=exp[e]; e++; while (ch!='\0'){ //扫描exp switch (ch){ case '+':st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];st.top--;break; case '-':st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];st.top--;break; case '*':st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];st.top--;break; case '/': if (st.data[st.top]!=0){ st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];st.top--;break; }else { printf("\n\t除零错误!\n"); exit(-1); } default: d=0; //数值存放到d中 while (ch>='0' && ch<='9') { d=10*d+ch-'0'; ch=exp[e];e++; } st.top++; st.data[st.top]=d; } //case ch=exp[e]; e++; } //while结束 return st.data[st.top]; } int main(){ char *exp="5#6#5#*+9#5#6#5#*+/+"; float b=compvalue(exp); printf("\n%f",b); return 1; }
运行结果:
35.257141
相关推荐
栈的应用广泛,其中之一就是用于解决算术表达式的求值问题。本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+...
在这个话题中,我们关注的是“表达式求值”,一个常见的数据结构应用,特别是中缀表达式到后缀表达式的转换以及其求值过程。中缀表达式是我们日常使用的数学表达式形式,如2 + 3 * 4,而后缀表达式,也称为逆波兰...
在实际应用中,这种技术广泛应用于计算器程序、编译器前端解析表达式、以及任何需要动态计算表达式值的场景。了解并掌握后缀表达式及其转换方法,不仅可以加深对数据结构和算法的理解,还能提高解决实际问题的能力。...
总的来说,这个数据结构课程设计项目是一个很好的机会,让你深入理解和应用数据结构,特别是栈和树,以及表达式求值的算法。它不仅锻炼了你的编程技巧,还提高了你对计算机科学基础的理解。在完成这个项目的过程中,...
总之,将原表达式转换为后缀表达式是解决表达式求值问题的一种有效方法,它简化了运算的逻辑,便于用栈数据结构实现。C语言作为一种强大且灵活的编程工具,非常适合编写这样的算法程序,而严蔚敏教授的《数据结构》...
在这个“数据结构栈的表达式实验报告”中,主要讨论了如何利用栈来实现算术表达式的求值。 实验的目标是加深对栈逻辑特性和物理特性的理解,并通过实际编程锻炼应用解决复杂问题的能力。具体来说,实验要求用C++...
在本项目中,我们将探讨如何利用C语言的数据结构——栈,来实现表达式的求值。栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,非常适合处理具有运算顺序的计算问题,如数学表达式的求值。 首先,...
本主题主要关注栈在表达式求解中的应用,特别是如何将中缀表达式转换为后缀表达式,并通过这种方式求解表达式的值。 中缀表达式是我们日常生活中常见的数学表达式形式,例如 \(2 + 3 * 4\),运算符位于操作数之间。...
在本次“数据结构实验——基于栈的表达式求值”中,我们将深入探讨如何利用栈这一数据结构来解决计算表达式的问题。栈是一种特殊的线性数据结构,它遵循后进先出(LIFO)的原则,这使得它在处理逆波兰表示法(也称为...
算术表达式求值是一个基本的问题,也是栈的应用的一个典型例子。在本设计中,我们设计了一个程序,演示用算符优先法对算术表达式的求值过程。 知识点6:测试用例设计 测试用例设计是一个重要的步骤,在本设计中,...
《表达式求值程序——深入理解.NET MFC与VC++实现》 在计算机科学中,表达式求值是计算编程语言中的一个基本概念,它涉及将符号表达式转化为实际值的过程。本文将深入探讨如何使用.NET框架、MFC(Microsoft ...
通过完成这项作业,学生将能够深入理解数据结构(如栈和哈希表)的应用,掌握解析和求解表达式的技术,并熟悉编程语言中的数值处理。同时,这也是一个很好的实践,可以锻炼问题解决、逻辑思考和调试技能。
数据结构课设——算数表达式求值是软件网络技术领域中的一项重要课设,旨在让学生掌握算数表达式的求值方法和数据结构的应用。 算术表达式是一种由操作数、运算符和界限符组成的表达式。操作数可以是正整数,运算符...
在本项目“数据结构课设——表达式的计算”中,我们主要探讨的是如何利用数据结构的知识来实现一个表达式求值器。这个课设旨在帮助我们深入理解数据结构的原理,并将其应用到实际问题的解决中。以下是相关知识点的...
C++实现表达式求值 本实验要求设计一个算术表达式求值的程序,该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=ab )的中缀表达式,并求出结果。如果表达式正确,则输出表达式的结果;如果表达式非法...
在这个项目中,我们关注的是一个特定的算法——中缀表达式转化为后缀表达式(也称逆波兰表示法)以及后缀表达式的求值,特别地,这个实现已经扩展了对负数和小数的支持。 中缀表达式是我们常见的数学表达式形式,如...
本篇将基于提供的源代码来深入探讨一个典型的表达式求值问题——利用栈(一种特殊的数据结构)进行后缀表达式的转换与计算。这里特别强调了栈的应用,栈是一种线性数据结构,遵循先进后出(First In Last Out, FILO...
通过本实验,学生能够进一步掌握栈的基本操作及其在实际问题中的应用,并理解并实现中缀表达式到后缀表达式的转换以及后缀表达式的求值过程。 #### 实验背景 算术表达式的求值是计算机科学中的一个基础问题。通常...
本项目通过两种方法——递归和后缀表达式(也称为逆波兰表示法)来解决简单表达式求值的问题。下面我们将详细探讨这两种方法及其在实现过程中的关键知识点。 首先,我们来看递归方法。递归是一种函数或过程调用自身...
本次实验是关于数据结构的一个实践案例——利用栈这一数据结构来实现中缀表达式的求值。实验的主要目的是让学生深入理解栈的基本概念及其在解决实际问题中的应用,特别是如何利用栈来进行表达式的解析与计算。 ####...