数据结构之表达式求值

这篇具有很好参考价值的文章主要介绍了数据结构之表达式求值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言

运用堆栈解决表达式的求值,代码思路为:

1.定义两个栈,一个char类型的栈用于存放运算符(ysf)一个int类型的栈用于存放操作数(czs)

如一个表达式3+6*9,将“+”,“*”入ysf栈,将“3”“6”“9”入czs栈

2.运用getchar进行数据的录入,如果接收的是运算符,将其插入到运算符栈中,如果接收的是数字字符,则将其插入至操作数栈中,注意这里接收的是字符而不是数字,将字符转为数字需用x-‘0’

3.运算符间进行优先级的比较

数据结构基于栈的表达式求值,数据结构,算法,c++

如上表(转自清华大学出版社数据结构与算法),运算符1的优先级与运算符2的优先级进行比较,使其返回“<”或“>”,遇到<则将运算符入栈,然后接着取下一个字符,遇到>则调取操作数进行运算,而要完成从栈顶循环运算至栈底的目的,则需在运算符栈底先插入一个“#”,然后默认插入结束后再插入一个“#”如图:

数据结构基于栈的表达式求值,数据结构,算法,c++

 文章来源地址https://www.toymoban.com/news/detail-861704.html

例子:ysf(运算符)栈中第一个默认为“#”,首先插入一个“+”,由表3.1可知“#”比“+”  等于“<”,所以将“+”入栈,栈顶元素现在为“+”,第二次插入“*”,“+”比“*”等于“<”,将“*”入栈,此时表达式结束

默认在结尾插入一个“#”,所以现在ysf栈中的元素由下至上为“#”,“+”,“*”,“#”四个元素,然后接着进行运算符优先级的比较,栈顶的“#”比“*”等于“>”所以取操作数进行计算,弹出“#”,现在栈顶元素为“*”,然后栈顶的“*”比“+”等于“>”,然后接着去操作数进行计算,依次类推,直到最后栈顶元素为“#”,程序结束。

第一步:运算符优先级表

int getindex(char c)//获取运算符所对应的索引
{
	int index;
	if(c=='+')
	{
		index = 0;
	}
	else if (c == '-')
	{
		index = 1;
	}
	else if (c == '*')
	{
		index = 2;
	}
	else if (c == '/')
	{
		index = 3;
	}
	else if (c == '(')
	{
		index = 4;
	}
	else if (c == ')')
	{
		index = 5;
	}
	else if (c == '#')
	{
		index = 6;
	}
	else
	{
		index = 9;
	}
	return index;
}
char reindex(int a,int b)//运算符优先级表,将索引转化为“>”,“<”
{
	char index[7][7] =
	{
		{'>','>','<','<','<','>','>'},
		{'>','>','<','<','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'<','<','<','<','<','=',' '},
		{'>','>','>','>',' ','>','>'},
		{'<','<','<','<','<',' ','='}
, };
	if (a < 7 && b < 7)
	{
		return index[a][b];
	}
	else
	{
		return '0';
	}
}

返回结果是“>”或“<”

第二步:具体运算

void get()
{
	int can=1,a=1,b = 1;
	char cz;
	ysf.push('#');
	int count = 0;
	char c = getchar();
	while ((c != '#' || ysf.top() != '#')&&can)//防止为空
	{
		//if(c=='\n'){c = '#';}//取消‘#’的限制条件;
		 can = 1;
		if (c >= '0' && c <= '9')
		{
			if (count == 1)
			{
				 a = czs.top();
				czs.pop();
				czs.push(a * 10 + (c - '0'));
				count = 1;
			}
			else
			{
				czs.push(c - '0');
				count++;
			}
			c = getchar();
		}
		else
		{
			count = 0;
			switch (reindex(getindex(ysf.top()), getindex(c)))
			{
			case'<':
				ysf.push(c);
				c = getchar();
				break;
			case'=':
				ysf.pop();
				c = getchar();
				break;
			case'>':
				 cz = ysf.top();
				ysf.pop();
				 a = czs.top();
				czs.pop();
				 b = czs.top();
				czs.pop();
				czs.push(ys(a, cz, b));
				break;
			case'0':
			{
				can = 0; 
			break;
			}
			}
		}
	}
	if (can == 1)
	{
		cout << czs.top();
	}
	else if (can == 0)
	{
		cout << "格式错误";
	}
}

 总代码

#include<iostream>
#include<stack>
using namespace std;
stack<char> ysf;
stack<int>czs;
int getindex(char c)
{
	int index;
	if(c=='+')
	{
		index = 0;
	}
	else if (c == '-')
	{
		index = 1;
	}
	else if (c == '*')
	{
		index = 2;
	}
	else if (c == '/')
	{
		index = 3;
	}
	else if (c == '(')
	{
		index = 4;
	}
	else if (c == ')')
	{
		index = 5;
	}
	else if (c == '#')
	{
		index = 6;
	}
	else
	{
		index = 9;
	}
	return index;
}
char reindex(int a,int b)
{
	char index[7][7] =
	{
		{'>','>','<','<','<','>','>'},
		{'>','>','<','<','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'<','<','<','<','<','=',' '},
		{'>','>','>','>',' ','>','>'},
		{'<','<','<','<','<',' ','='}
, };
	if (a < 7 && b < 7)
	{
		return index[a][b];
	}
	else
	{
		return '0';
	}
}
int ys(int a, char cz, int b)
{
	switch (cz)
	{
	case'+':
		return a + b;
	case'-':
		return b - a;//栈的先进后出
	case'*':
			return a * b;
	case'/':
		return b / a;//too
	default:
		break;
	}
}

void get()
{
	int can=1,a=1,b = 1;
	char cz;
	ysf.push('#');
	int count = 0;
	char c = getchar();
	while ((c != '#' || ysf.top() != '#')&&can)//防止为空
	{
		//if(c=='\n'){c = '#';}//取消‘#’的限制条件;
		 can = 1;
		if (c >= '0' && c <= '9')
		{
			if (count == 1)
			{
				 a = czs.top();
				czs.pop();
				czs.push(a * 10 + (c - '0'));
				count = 1;
			}
			else
			{
				czs.push(c - '0');
				count++;
			}
			c = getchar();
		}
		else
		{
			count = 0;
			switch (reindex(getindex(ysf.top()), getindex(c)))
			{
			case'<':
				ysf.push(c);
				c = getchar();
				break;
			case'=':
				ysf.pop();
				c = getchar();
				break;
			case'>':
				 cz = ysf.top();
				ysf.pop();
				 a = czs.top();
				czs.pop();
				 b = czs.top();
				czs.pop();
				czs.push(ys(a, cz, b));
				break;
			case'0':
			{
				can = 0; 
			break;
			}
			}
		}
	}
	if (can == 1)
	{
		cout << czs.top();
	}
	else if (can == 0)
	{
		cout << "格式错误";
	}
}
int main()
{
	get();//()记得用英文输入法;

	return 0;
}

 

 

到了这里,关于数据结构之表达式求值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】12 堆栈应用:表达式求值

    有一个常量表达式的中缀表达式为:5 + 6 / 2 - 3 * 4,其后缀形式表示为: 5 6 2 / + 3 4 × -。后缀表达式的特点是运算符位于两个预算数之后。其前缀表达式为: - + 5 / 6 2 × 3 4。 后缀表达式相比于中缀表达式的求值要容易很多。 从左到右扫描该表达式: (1)遇见运算数5 6 2时不

    2024年02月20日
    浏览(42)
  • 数据结构 | 栈的中缀表达式求值

    目录 什么是栈? 栈的基本操作 入栈操作 出栈操作 取栈顶元素 中缀表达式求值 实现思路 具体代码 栈是一种线性数据结构,具有“先进后出”(Last In First Out, LIFO)的特点。它可以看作是一种受限的线性表,只能在表的一端进行插入和删除操作,这一端被称为栈顶,另一端

    2024年02月02日
    浏览(43)
  • 数据结构课程实验二:运用栈实现表达式求值

    目录 一、实验目的 二、实验内容 三、实验提示  四、实验思路

    2023年04月17日
    浏览(30)
  • 数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

    🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:Aileen_0v0🧸—CSDN博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:Aileen_0v0🧸

    2024年02月07日
    浏览(41)
  • 【数据结构】【栈(stack)应用】四则运算表达式求值(带括号)

            先理解原理,再看代码,注意标红字体很重要!结尾附完整测试代码,C语言实现! 更新留言:         本来是侧重演示栈结构的使用,后面评论区发现很多朋友对这个四则运算比较感兴趣,特此做了更新,新增了对负数的运算支持。         若您也有新的想法

    2024年02月08日
    浏览(36)
  • 【数据结构】【栈(stack)应用】四则运算表达式求值(支持括号、负数)

            先理解原理,再看代码,注意标红字体很重要!结尾附完整测试代码,C语言实现! 更新留言:         本来是侧重演示栈结构的使用,后面评论区发现很多朋友对这个四则运算比较感兴趣,特此做了更新,新增了对负数的运算支持。         若您也有新的想法

    2024年02月05日
    浏览(34)
  • 【数据结构】利用顺序栈/链栈完成表达式求值(C语言实现)

    利用顺序栈完成表达式求值(将字符型转换为整型) 程序代码: #include stdio.h #include malloc.h #include stdlib.h #include math.h #define MAXSIZE 100 #define ElemType char #define LEN sizeof ( ElemType ) typedef struct {     ElemType * data;     int top; } SqStack ; void InitStack( SqStack * S ) {     S -data = ( ElemType *)

    2024年02月05日
    浏览(39)
  • 【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

    大家好,很高兴又和大家见面啦!!! 在前面的内容中我们详细介绍了栈的第一种应用——在括号匹配问题中的应用,如果还没有阅读过的朋友可以回看前面两篇文章。在今天的内容中我们将介绍栈的另一种应用——在表达式求值中的应用。 表达式相信大家应该不陌生了,

    2024年04月27日
    浏览(27)
  • 【数据结构练习题】栈——1.括号匹配 2.逆波兰表达式求值 3.出栈入栈次序匹配 4.最小栈

    ♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ 在学习数据结构的过程中遇到了各种各样类型的题目,我在解答这些题目的时候收获了不少,所以我想开设一个专栏来分享我平时做题的收获,在我分享的题中我采用三步法来阐述,希望大家可

    2024年04月09日
    浏览(47)
  • 《数据结构》:中缀表达式转后缀表达式 + 后缀表达式的计算

    补充了一个判断输入中缀表达式 合法性 的代码: 《数据结构》:中缀表达式合法性判断_Amentos的博客-CSDN博客   目录 一、基本概念 二、中缀表达式转后缀表达式    例       中缀表达式  2*(3+5)+7/1-4  转换为后缀表达式 三、后缀表达式的计算    例       后缀表达式

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包