基于顺序存储结构的栈

栈也是一种线性结构,如果用一句话介绍栈的话,那就是后进先出(LIFO:Last In First Out)。栈的特性是由于其特殊的存取方式决定的,那就是只能在一端进行存取动作。可以存取的一端一般称为栈顶,另一端称为栈底。究竟栈底索引置为-1还是置为0也是一个讲究,普遍的方法是置为-1,这一点在后面的存取操作中会发现优势。 一般有push和pop操作,以及栈空,栈满等判断。

本文介绍的是基于顺序存储结构的实现,那就是用到了数组,为了更灵活采取的是动态开辟内存空间的形式。栈结构中还有一个top这个俗称栈指针的东西很重要。其实就是一个整型下标索引值。

//在进栈和出栈时 先判断条件是否成立 重中之重
#pragma once
#include<iostream>
using namespace std;
template<class T>
class Stack
{
public:
	int MAXSIZE;//栈最大体积
	T *arr;//动态空间
	int top;//类似于指向当前元素的栈指针
public:
	Stack(const int stacksize = 100);//构造函数
	Stack(const Stack<T>& S);//深复制
	~Stack();//析构函数
	void DestroyStack();//销毁栈
    void output();//输出栈元素 一次性全部输出栈元素
	T pop();//出栈
	void push(T pushelem);//进栈
	bool isEmpty();//判栈满
	bool isFull();//判栈空
	int GetSize();//返回栈元素数
	int Gettop();
};
template<class T>
int Stack<T>::Gettop()
{
	return top;
}
template<class T>
Stack<T>::Stack(const int stacksize)
{
	if(stacksize < 0)//初始化参数 判断
	{
		cout<<"非法值"<<endl;
		exit(1);
	}
	MAXSIZE = stacksize;
	arr = new T[MAXSIZE];
	top = -1 ;//指针 初始化为-1,此时无元素
}
//深复制函数
template<class T>
Stack<T>::Stack(const Stack<T>& S)
{
	MAXSIZE = S.MAXSIZE;
	arr = new T[MAXSIZE];
	if(arr == NULL)
	{
		cout<<"内存分配错误"<<endl;
		exit(1);
	}
	int current = S.top ;//不用top指针操作,防止篡改了top值
	while(current != -1)//复制 直到栈指针指向栈底后一位,跳出循环
	{
		arr[current] = S.arr[current] ;
		current-- ;
	}
	top = S.top ;//把top值赋给当前栈
}

template<class T>
Stack<T>::~Stack()
{
	delete []arr ;//连续空间的删除
}
template<class T>
void Stack<T>::DestroyStack()
{
	delete []arr ;//类似于析构函数的作用,在过程中使用
}
//返回栈最大体积
template<class T>
int Stack<T>::GetSize()
{
	return MAXSIZE ;
}
//判栈满
template<class T>
bool Stack<T>::isFull()
{
	return ((top == MAXSIZE-1) ? true : false);
}
//判栈空
template<class T>
bool Stack<T>::isEmpty()
{
	return (( top == -1) ? true : false);
}
//输入
/*template<class T>
void Stack<T>::input()
{
}*/

//输出
template<class T>
void Stack<T>::output()
{
	int current = top;//只能从栈顶以此输出
	while(current != -1)
	{
		cout<<arr[current]<<endl;
		current--;
	}
}
//压栈
template<class T>
void Stack<T>::push(T pushelem)
{
	if(top == MAXSIZE-1)//栈满,无法压栈操作
	{
		cout<<"Stack is full!"<<endl;
	    return ;
	}
	arr[++top] = pushelem ;
}
//出栈
template<class T>
T Stack<T>::pop()
{
	if(top == -1)//空栈,无法执行出栈操作
	{
		cout<<"Stack is empty!"<<endl;
		exit(1);
	}
	return arr[top--];//只在栈顶的操作,方便快捷,修改top值即可
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值