1、栈的概念
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。总的来说就是LIFO(Last In First Out);
代码:
#pragma once
/*
*Copyright© 中国地质大学(武汉) 信息工程学院
*All right reserved.
*
*文件名称:Stack.h
*摘 要:编写栈算法
*
*当前版本:1.0
*作 者:邵玉胜
*完成日期:2018-12-28
*/
#ifndef STACK_H_
#define STACK_H_
#include<iostream>
//结点结构体,双向栈
template<class T>
struct StackNode
{
T _tData; //数据域
StackNode<T>* _pNext; //指针域,指向下一结点
StackNode<T>* _pLast; //指针域,指向上一结点(为了行编辑器函数的实现)
StackNode(StackNode<T>* next = nullptr,
StackNode<T>* last = nullptr) { //用指针构造函数
this->_pNext = nullptr;
this->_pLast = nullptr;
}
StackNode(T data, StackNode<T>* next = nullptr,
StackNode<T>* last = nullptr) { //用指针构造函数
this->_tData = data;
this->_pNext = next;
this->_pLast = last;
}
};
template<class T>
class Stack {
private:
StackNode<T>* _pTop; //栈顶指针
StackNode<T>* _pBottom; //栈底指针,为了方便行编辑器使用
int _iConuntOfElement; //结点数量
public:
Stack(); //构造函数
Stack(Stack<T>& copy); //构造函数
~Stack(); //析构函数
bool IsEmpty(); //判断栈是否为空
void MakeEmpty(); //将栈中的元素全部删除
void Put(const T data); //顶端插入数据
int Size() { return _iConuntOfElement; } //返回栈中的结点数
void GetTop(T& data); //获取顶端结点
void Pop(T& data); //顶端弹出结点,并将元素传至参数中
void Traverse(); //逆序栈中的结点
void DisPlay(bool forward = true); //输出函数,默认正向输出
};
//构造函数,为栈顶和栈底分配内存
template<class T>
Stack<T>::Stack() {
_pTop = _pBottom = nullptr;
this->_iConuntOfElement = 0;
}
//拷贝构造函数
//缺少此函数,在传参与析构的时候容易出问题
template<class T>
Stack<T>::Stack(Stack<T>& copy) {
StackNode<T>* pCur = this->_pTop; //建立指针,用于遍历本对象中的结点
while (pCur) { //遍历本对象的结点
T data = pCur->_tData; //依此取出结点值
copy.Put(data); //插入到copy栈中
pCur = pCur->_pNext;
}
}
//析构函数
template<class T>
Stack<T>::~Stack() {
MakeEmpty(); //释放结点内存
this->_pTop = this->_pBottom = nullptr; //将指针指向空,避免出现野指针
}
//判断栈是否为空
template<class T>
bool Stack<T>::IsEmpty() {
if (!this->_pTop) //如果栈对象没有头节点,那么栈就为空
return true;
return false;
}
//将栈中的元素全部删除
template<class T>
void Stack<T>::MakeEmpty(){
StackNode<