线性表--栈的数组实现和链表实现

本文探讨了栈这种后进先出(LIFO)数据结构的实现方式,包括基于线性表的数组描述和链表描述。在数组实现中,push操作可能涉及数组扩展和元素复制;而在链表实现中,虽然避免了数组扩展,但仍有额外的操作影响性能。文章还对这两种实现进行了测试。
摘要由CSDN通过智能技术生成

把线性表的插入和删除操作限制在同一端进行就得到栈数据结构,因此栈是一个后进先出(LIFO)的数据结构。

抽象数据类型ADT
#pragma once
template <typename T>
class stackADT{
   
public:
	virtual ~stackADT(){
    }//虚析构函数
	virtual bool empty() const = 0;//栈空返回true
	virtual int get_size() const = 0;//返回栈里元素个数
	virtual T top() const = 0;//返回栈顶元素
	virtual void push(const T& _element) = 0;//压栈
	virtual void pop() = 0;//出栈
};
栈操作的异常类
#pragma once
#include <string>
using std::string;
#include <iostream>
using std::cin; using std::cout; using std::cerr; using std::ostream; using std::istream;
using std::ends; using std::endl;
class stackEmpty{
   
public:
	stackEmpty(string _message="Invalid operation on empty stack!"):message(_message){
    }
	~stackEmpty(){
    }
	string what()const {
    return message; }
	void output()const {
    cerr << message << endl; }
private:
	string message;
};
基于线性表–数组描述的栈实现
#pragma once
#include "stackEmpty.h"
#include "stackADT.h"
#include "../../../ch05/ArrayList/ArrayList/myArrayList.h"

//=========================从数组表myArrayList派生得到的数组栈类==============================
template <typename T>
class stackDerivedFromArrayList:private myArrayList<T>,public stackADT<T>{
   
public:
	//直接调用myArrayList的构造函数 创建一个数组容量为10的数组
	stackDerivedFromArrayList(int _initialCapacity=10):myArrayList<T>(_initialCapacity){
    }
	~stackDerivedFromArrayList(){
    }
	//其余拷贝控制成员使用合成的即可 它们会调用myArrayList的相应成员进行相应的操作
	//...

	//其余栈ADT的接口也通过直接调用myArrayList的共有方法来实现
	bool empty()const {
    return myArrayList<T>::empty(); }
	
	int get_size()const {
    return myArrayList<T>::get_size(); }
	
	//在myArrayList中的get_element方法会对索引size-1进行检查而引发illegalParameterValue异常类
	//但是在栈的用户角度并不能理解这个异常的意思 因此我们对top捕捉异常参数类重新抛出emptyStack异常类便于用户理解
	T top()const {
   
		try {
   
			return myArrayList<T>::get_element(myArrayList<T>::get_size()-1);
		}
		catch (illegalParameterValue) {
   
			throw stackEmpty();
		}
	}
	
	void push(const T& _element) {
   
		myArrayList<T>::insert(_element, myArrayList<T>::get_size());
	}

	void pop(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值