一、从原表达式求得后缀式
表达式存放在字符型数组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
相关推荐
该程序很好实现了算术表达式求值,支持+、-、*、/,以=结束,符合正常表达式。
栈的应用——表达式求解,内容主要有 中缀表达式转换成后缀表达式以及求解过程,需要可自行下载
数据结构 课程设计 表达式求值
C++实现表达式求值 本实验要求设计一个算术表达式求值的程序,该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=ab )的中缀表达式,并求出结果。如果表达式正确,则输出表达式的结果;如果表达式非法...
关于数据结构栈的表达式实验报告,自己写的,可以参考一下的吧,可以输入小数进行计算
本程序利用两个栈——一个符号栈一个数字栈,实现了中缀表达式的计算,代码风格是C++,运行平台是QT,欢迎大家下载参考。
2) 掌握栈的典型应用——后缀表达式求值。 2. 实验内容 1) 用键盘输入一个整数后缀表达式(操作数的范围是0~9,运算符只含(、(、*、/,而 且中间不可以有空格),使用循环程序从左向右读入表达式; 2) 如果读入的...
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 【基本要求】 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。...
大二下半学期数据结构课程设计——算术表达式求值是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。
栈的应用——括号的匹配,输入表达式,判断表达式是否匹配成功。。。。。。。。
2.3.6 栈的应用——四则运算表达式求值 10 3 实验三 二叉树的构造与遍历 13 3.1 实验目的 13 3.2 实验要求 13 3.3 实验内容 13 3.3.1 二叉树结构体的构造 13 3.3.2 二叉树的节点产生 13 3.3.3 二叉树的前序遍历 14 ...
表达式求值 ——栈的操作和应用 本程序是一个控制台程序,要求用户从控制台输入语法正确的、不含变量的表达式,并利用给定的优先关系实现对算术四则运算的求值。变大时可以使用加减乘除四则运算符,支持括号、浮点数
3.1.4 栈的应用 3.2 队列 3.2.1 队列的定义及运算 3.2.2 队列的顺序存储结构(向量) 3.2.3 队列的链表存储结构 3.3 栈和队列的算法实现举例 习题三 第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.2.1 串...
表达式求值 队列的应用——银行客户平均等待时间 计算next值 KMP算法 二叉树的构建及遍历操作 实现二叉排序树的各种算法(1) 实现二叉排序树的各种算法(2) 哈夫曼树 顺序查找 二分查找 哈希查找 直接插入...
3.2.3 表达式求值 51 3.3 栈与递归 54 3.3.1 采用递归算法解决的问题 54 3.3.2 递归过程与递归工作栈 57 3.3.3 递归算法的效率分析 59 3.3.4 将递归转换为非递归的方法 60 3.4 队列 61 3.4.1 队列的...
codeup《算法笔记》6.7小节——C++标准模板库(STL)介绍->stack的常见用法详解题目A:简单计算器题目编号:1918、《算法笔记》7.1小节——数据结构专题(1)->栈的应用题目A:简单计算器题目编号:1918: 题目描述: ...
堆栈、线性表相关函数:链和数组实现队列类、 栈类,并有对应的应用——车站调度以及中缀后缀表达式的分析。
5.4值栈与ognl表达式 100 5.5struts2的标签库 103 5.5.1控制标签 103 5.5.2数据标签 104 5.5.3表单标签 105 5.5.4非表单ui标签 107 本章小结 108 课后练习 109 第6章struts2高级应用 110 6.1拦截器 110 ...
4.2.2 一个例子——表达式树 4.3 查找树ADT——二叉查找树 4.3.1 contains 4.3.2 findMin和findMax 4.3.3 insert 4.3.4 remove 4.3.5 析构函数和复制赋值操作符 4.3.6 平均...
*5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...