数据结构 实验2——表达式求值

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

一、实验名称:表达式求值

二、实验学时:6学时

三、实验目的

1.理解栈的结构特点和基本操作特性;

2.掌握利用栈实现表达式求值算法。

四、实验内容(步骤)

输入一个算术表达式(以“=”结束),求其值。要求表达式以“=”结束,操作数为多位实数,对错误表达式要进行检测。

1.设置两个栈:optr算符栈和opnd操作数栈。初始置opnd为空栈;起始符“=”为optr的栈底元素;

2.自左向右扫描表达式中的每个字符c:

1)若c为操作数,则进opnd栈;

2)若c为算符,则让optr栈的栈顶元素与c比较优先级:

a.若栈顶算符优先级低于刚读入的运算符c,则让刚读入的运算符c进optr栈。

b.若栈顶算符优先级高于刚读入的运算符c,则将栈顶算符退栈,送入q;同时将操作数栈opnd退栈两次,得到两个操作数b、a,对a、b进行aqb运算后,将运算结果作为中间结果推入opnd栈。

c.若栈顶运算符的优先级与刚读入的运算符c相同,说明左右括号相遇,只需将栈顶运算符(左括号)退栈即可。

3.直到扫描到c为定界符,即optr栈的栈顶元素和当前读入的字符均为“=”,则整个表达式求值完毕。

实验源代码

#include<iostream>
#include<cstdlib>
#include<cmath>

#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

using namespace std;

typedef int DataType;

typedef struct
{
	DataType data[MAXSIZE];
	int top;	
}SqStack;

int InitStack(SqStack &S) // 构造一个空栈 S 
{
	S.top=-1;
	return OK;
}

int StackEmpty(SqStack S) // 判栈为空栈时返回值为真,反之为假 
{
	return(S.top==-1?TRUE:FALSE); 
}

int StackFull(SqStack S) // 判栈为满栈时返回值为真,反之为假 
{
	return(S.top==MAXSIZE-1?TRUE:FALSE); 
}

int Push(SqStack &S,DataType e) // 将元素e插入到栈中,作为新栈顶 
{
	if(StackFull(S))
	return ERROR; // 栈满
	S.top++; // top+1,栈顶位置上移
	S.data[S.top]=e;
	return OK; 
}

int Pop(SqStack &S,DataType &e) // 若栈不为空,则删除栈顶元素 
{
	if(StackEmpty(S))
	return ERROR; // 栈空
	e=S.data[S.top];
	S.top--;
	return OK; 
}

DataType GetTop(SqStack S) // 若栈不为空,则取栈顶元素 
{
	DataType e;
	if(StackEmpty(S))
	return ERROR; // 栈空
	e=S.data[S.top]; // 取出数据,top不变
	return e; 
}

char Precede(char a,char b) // 比较两个算符的优先级 
{
	char z;
	if((b=='+')||(b=='-')||(b=='*')||(b=='/')||(b=='(')||(b==')')||(b=='='))
	switch(a)
	{
		case '+':
		case '-':
			if((b=='*')||(b=='/')||(b=='('))
			    z='<';
			else
			    z='>';break;
		case '*':
		case '/':
			if(b=='(')
			    z='<';
			else
			    z='>';break;
		case '(':
			if (b=='=')
			    z='E';
		    else if(b==')')
		        z='=';
		    else z='<';
		    break;
		case ')':
			if(b=='(')
			    z='E';
			else
				z='>';
			break;
		case '=':
			if(b=='=')
			    z='=';
			else if(b==')')
			    z='E';
			else z='<';break;
	}
	else z='E';
	return(z);
}

int In(char ch) // 判断字符ch是否为算符
{
	int i,flag=0;
	char op[7]={'+','-','*','/','(',')','='};
	for(i=0;i<7;i++)
	{
		if(ch==op[i])
		{
			flag=1;break;
		}
    }
    return flag;
}

DataType Operate(DataType a,char theta,DataType b)
{
	DataType z;
	switch(theta)
	{
		case '+':z=a+b;break;
		case '-':z=a-b;break;
		case '*':z=a*b;break;
		case '/':z=a/b;break;	
	}
	return(z);
}

int CaculateExpression()
{
	SqStack optr,opnd;
	DataType x,theta,a,b,s;
	char c;
	c=getchar();
	InitStack(optr);
	Push(optr,(DataType)'=');
	InitStack(opnd);
	
	while(c!='=' || (char)GetTop(optr)!='=')
	{
		if(!In(c))
		{
			s=c-48; // s=c-'0'; 
			Push(opnd,(DataType)s);
			c=getchar();
		}
		else
		switch(Precede((char)GetTop(optr),c))
		{
			case '<': // 栈顶算符优先级低
				Push(optr,(DataType)c);
				c=getchar();
				break;
			case '=': // 优先级相同,脱去括号
				Pop(optr,x);
				c=getchar();
				break;
			case '>': // 栈顶算符优先级高,退栈并将运算
				Pop(optr,theta);
				Pop(opnd,b);
				Pop(opnd,a);
				Push(opnd,Operate(a,(char)theta,b));
			    break;
			case 'E':printf("表达式中括号不匹配!");exit(1);
		}
	}
	return GetTop(opnd);
}

int main()
{
	printf("%d\n",CaculateExpression());
	return 0;	
}

运行结果

数据结构 实验2——表达式求值文章来源地址https://www.toymoban.com/news/detail-404703.html

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

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

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

相关文章

  • 数据结构 | 栈的中缀表达式求值

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

    2024年02月02日
    浏览(42)
  • 【数据结构】12 堆栈应用:表达式求值

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

    2024年02月20日
    浏览(42)
  • 数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

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

    2024年02月07日
    浏览(40)
  • 数据结构——基于二叉树的表达式求值算法

    1.输入一个表达式(表达式中的数均小于10的正整数),利用二叉树来表示该表达式,创建表达式数,然后利用二叉树的遍历操作求表达式的值。 2.输入要求:多组数据,每组数据1行,为一个表达式,表达式以“=”结尾。当输入只有一个“=”时,输入结束。 3.输出要求:每组

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

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

    2024年02月08日
    浏览(35)
  • 【数据结构】利用顺序栈/链栈完成表达式求值(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日
    浏览(38)
  • 【数据结构】【栈(stack)应用】四则运算表达式求值(支持括号、负数)

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

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

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

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

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

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

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

    2024年02月03日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包