C++表达式求值(利用数据结构栈)

唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行。这不经让我

想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的表

达式)的简单计算器程序。刚把两个程序对照了一下。感触还是挺深的,同一时候也再一次体现了数据结构在程序设计

中的重要性。

曾经的那个程序有漏洞并且逻辑复杂,所以就不提了,仅仅说说如今改进后的程序,其思想主要是用到了

栈先进后出的数据结构。在该程序中建有两个栈:一个用于存储运算符,还有一个用于存储操作数或运算结果。基本

过程是:

(1):首先设置操作数栈为空栈,设置运算符栈以‘#’为栈底元素(其优先级最低)。

(2):通过为栈内栈外运算符设置值而比較其优先级

(3):依次去找到表达式中的全部运算符和操作数,对于操作数直接入栈。运算符则和运算符栈的

栈顶运算进行比較优先级,若栈内优先级大,则进行对应操作并操作数和栈内运算符都出栈,若优先级相等仅仅需

栈内运算符出栈继续查找下一个运算符就可以,若栈内优先级低则栈外运算符入栈。依次循环知道分析完表达式中

的全部运算符和操作数就可以。

(4):最后在操作数栈中将仅仅会剩下唯一的一个元素,而该元素也将就会是所求表达式的值。

#include<iostream>
#include<stack>
#include<string>
using namespace std;

/*推断符号间的优先关系函数
*1表示>,0表示=,-1表示<
*c1栈内的算符。c2栈外的算符
*/
int Judge(char c1,char c2)
{
	int a1,a2;
	if(‘+‘==c1||‘-‘==c1) a1 = 3;
	if(‘*‘==c1||‘/‘==c1)a1 = 5;
	if(‘(‘==c1) a1 = 1;
	if(‘)‘==c1) a1 = 7;
	if(‘#‘==c1) a1 = 0;

	if(‘+‘==c2||‘-‘==c2)a2 = 2;
	if(‘*‘==c2||‘/‘==c2)a2 = 4;
	if(‘(‘==c2) a2 = 6;
	if(‘)‘==c2) a2 = 1;
	if(‘#‘==c2) a2 = 0;
	if(a1>a2) return 1;
	if(a1==a2) return 0;
	if(a1<a2) return -1;
}
//符号运算函数
double run(char c ,double d1,double d2)
{
	switch (c)
	{
	case ‘+‘:
		return d1+d2;
		break;
	case ‘-‘:
		return d1-d2;
		break;
	case‘*‘ :
		return d1*d2;
		break;
	case ‘/‘:
		return d1/d2;
		break;
	default:
		return 0.0;
		break;
	}
}
int main()
{
	char * op = "+-*/()#";
	string str ;
	cin>>str;
	//给表达式字符串str加入‘#‘结束标识符
	str.append(1,‘#‘);
	stack<char> OPTR;//运算符栈
	stack<double> OPND;//操作数栈
	int a = -1;
	//先将#符号入栈
	OPTR.push(‘#‘);
	while(true)
	{
	 int b = a+1;
	 a = str.find_first_of(op,a+1);
	 if(a==string::npos) break;
	 if(a!=b)
	 {
	 string ss(str,b,a-b);
	 double d=atof(ss.c_str());
	 //数据先入栈
	 OPND.push(d);
	 }
	 //运算符优先级比較
	 int ju = Judge(OPTR.top(),str[a]);
	 if(-1==ju)//栈外优先级大直接入栈
	 {
	     OPTR.push(str[a]);
	 }
	 if(0==ju)//栈内外优先级相等则出栈
	 {
		 OPTR.pop();
	 }
	 if(1==ju)//栈内优先级大,出栈进行运算
	 {
		 double d1 = OPND.top();
		 OPND.pop();
		 double d2 = OPND.top();
		 OPND.pop();
		 d1 = run(OPTR.top(),d2,d1);
		 //运算结果入栈
		 OPND.push(d1);
		 OPTR.pop();
		 a--;
	 }
	}
	//删除表达式最后的‘#‘结束标识符
	str.erase(str.length()-1,1);
	cout<<str<<" = "<<OPND.top()<<endl;
}

时间: 2024-12-26 21:20:37

C++表达式求值(利用数据结构栈)的相关文章

表达式求值(数据结构书上栈的应用之一)

主要内容:表达式求值,提交nyoj通过... 思路:主要就是一个开两个栈,然后一个操作符栈,一个操作数栈.. 我的代码如下(比较简洁): /***** Author Gery ******/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<cmath&

表达式求值(数据结构书上栈的应用之中的一个)

主要内容:表达式求值.提交nyoj通过... 思路:主要就是一个开两个栈,然后一个操作符栈.一个操作数栈. . 我的代码例如以下(比較简洁): /***** Author Gery ******/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<cma

数据结构例程——表达式求值(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值. 例:用户输入一个包含"+"."-"."*"."/".正整数和圆括号的合法数学表达式,计算该表达式的运算结果. 解答: #include <stdio.h> #include <stdlib.h> #define MaxOp 100 #define MaxSize 100 struct //设定运算符优先级 { char

NYOJ305 表达式求值(递归or栈)

题目意思: http://acm.nyist.net/JudgeOnline/problem.php?pid=305 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 假设表达式可以简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 如果 x 和 y 是 表达式,则 函数min(x,y

表达式求值相关算法

实现对一个数学表达式的求值,例如:1+2*(3+4) 这个表达式的值为 15 这个问题主要要分为如下几个步骤: 语法分析: 将字符串表达式转化为数字和操作符的 token 数组,['1', '+', '2', '*', '(', '3', '+', '4', ')'] 转逆波兰表达式: 将中缀表达式转后缀表达式,['1', '2', '3', '4', '+', '*', '+'] 逆波兰表达式求值: 15 逆波兰表达式转二叉树: 条件表达式中,二叉树的求值能提前返回,能比逆波兰表达式计算量更少

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例: