山东大学 数据结构 实验4 堆栈的应用

该实验旨在掌握堆栈的使用,要求输入合法的数学表达式,如2 + 3 * ( 4 + 5 ) - 6 / 4,并计算结果。通过将数据和运算符分别入栈,依据运算符优先级进行计算。遇到括号时,处理括号内的运算。实验中还需特别处理负数和+-运算的符号问题。提供的代码可供参考,注释后可展示计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验四  堆栈的应用

一、 要求完成时间

实验开始后的第五周之前完成

二、 实验目的

掌握堆栈的使用。

三、 实验内容

1、 输入一个数学表达式(假定表达式输入格式合法),计算表达式结果并输出。

2、 数学表达式由单个数字和运算符“+”、“-”、“*”、“/”、“(、) ”构成,例如 2 + 3 * ( 4 + 5 ) - 6 / 4。

3、 变量、输出采用整数,只舍不入。

四、 输入输出请严格按下面要求的格式实现

 


 

分析:

1.将输入的字符串拆分,分别将数据与操作符放到两个堆栈里。

2.定义操作符的优先级别,当一个操作符要入栈时先判断栈顶的操作符的优先级是不是比它大,意思就是当准备入+或-时,可以计算栈里的*或/了。

3.当遇到)时要将栈里的操作符拿出进行运算,直到遇到(,表示括号处理完毕。

4.当最后一个操作符处理完后,还要将栈内剩余的操作符都处理了,因为此时剩下的都是同级的+-或*/。

5.注意:对*/操作好说,但是对于+-运算,由于我采用的是从后往前计算,所以-a-b = -(a+b)和 -a+b = -(a-b) ,就是+-需要根据前面的符号判断是否需要变号。

6.对于负数的处理,如果将-看成是操作符会导致计算结果错误,因为每个操作符对应两个操作数,会不匹配的。我是这么处理的:-1 = 0-1,将它补充成正常的整数计算。

 

以下是代码,有点略多,仅供参考,希望你写出更好的法!


代码:

//自定义链表形式的堆栈

#include<iostream>

#include<string>

using namespace std;



template<class T>

class Node{

public:

T data;

Node<T> *link;

};



template<class T>

class LinkedStack{

public:

LinkedStack(){topNode=0;}

~LinkedStack();

bool IsEmpty()const{return topNode==0;}

bool IsFull()const;

T Top()const;

LinkedStack<T>& PushStack(const T&x);

LinkedStack<T>& PopStack(T&x);

LinkedStack<T>& PopStack();

Node<T> *topNode;

void Show()const;

int Size()const;

};



//处理数组越界的报错

class OutOfBounds{    

    public:    

        OutOfBounds(){    

        cout<<"Out Of Bounds!"<<endl;    

        }    

};  

  

    

//内存不足的异常类    

class NoMem{    

    public:    

        NoMem(){    

            cout<<"No Memory!"<<endl;    

      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值