栈和队列-算术表达式的求值

该博客介绍了如何使用算符优先法和栈数据结构来求解不含变量的整数算术表达式。通过实验步骤,解释了如何识别运算符和操作数,转换字符序列并进行计算。算法涉及两个栈,一个用于存储运算符,另一个用于存储操作数。程序以C语言实现,但存在限制,仅接受个位数作为输入。
摘要由CSDN通过智能技术生成

【实验目的】

通过上机实践掌握队列和栈的顺序存储结构和链式存储结构,以便我们能在相应的应用问题中正确选用它们;掌握栈和队列的特点,即先进后出与先进先出的原则;掌握栈和队列的基本运算,如入栈和出栈、入队与出队等运算在顺序存储结构和链式存储结构上的实现。

【实验内容】

实验题目一:算术表达式的求值

【实验步骤】

1.设计一个程序演示用算符优先法对算术表达式的求值过程。

2.以字符序列形式从终端输入语法正确的、不含变量的整数表达式。利用课本3.2.5节中给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照课本上的例子演示在求值过程中运算符栈、运算数栈、输入字符和主要操作的变化过程。

3.显然要先考虑所用到的栈存储结构,以及栈的初始化、出栈、入栈、取栈顶元素等一系列的栈的基本操作的实现,以便生成运算符栈和操作数栈,及实现算符优先法的算法。注意,在读入表达式的字符序列的同时完成运算符和操作数的识别处理,以及相应的运算。在识别操作数的同时,别忘记将字符序列形式转换成整数形式!还要在程序的适当位置输出运算符栈、操作数栈、输入字符和主要操作的内容。有可能的话,还要考虑用户输入表达式时可能会犯的简单的语法错误,给予适当的提示,象括号不匹配、错误的运算符之类。

4 测试数据:3*(7-2);8;1+2+3+4;88-1*5;1024/4*8;1024/(4*8);(20+2)*(6/2);3-3-3;

8/(9-9);2*(6+2*(3+6*(6+6)));(((6+6)*6+3)*2+6)*2;

【算法思想】

为实现算符优先算法,这里使用两个工作栈,一个为OPTR,用以寄存运算符;另一个为OPND,用以寄存操作数或运算结果。算法的基本思想:

(1)首先置操作数栈为空,表达式起始符“#”为运算符栈的栈底元算;

(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。

【参考程序】

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define DEBUG

#define NULL 0

#define ERROR -1

#define STACKSIZE 20

/* 定义字符类型栈 */

typedef struct{

char stackname[20];

char *base;

char *top;

} Stack;

/* ----------------- 全局变量--------------- */

Stack OPTR, OPND; /* 定义前个运算符栈,后个操作数栈 */

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值