
堆栈
堆栈和队列
堆栈
基本概念
限定只能在固定一端进行插入或删除操作的线性表
特点:先进后出
允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。
堆栈抽象数据类型
数据集合:{a0,a1,……,an}ai的数据类型为Datatype
操作集合:
- Initiate(S)初始化栈堆S
- Push (S,x)入栈
- Pop(S,d)出栈
- GetTop(S)取栈顶数据元素
- NotEmpty(S)堆栈S非空否
顺序堆栈类
顺序堆栈:顺序存储结构的堆栈
顺序栈的存储结构:它是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,结构如下表所示:
栈底 | 栈顶 | …… | |||||
---|---|---|---|---|---|---|---|
a |
a |
a |
a |
a |
…… | ||
0 | 1 | 2 | 3 | 4 | 5(top) | …… | MaxStackSize - 1 |
an:顺序堆栈中已存储的数据元素
stack: 存放数据元素的数组
MaxStackSize - 1:最大存储单元个数
top :栈顶指针,指向下一个存储位置(下标)
类的定义:
class SeqStack
{
private:
DataType data[MaxStackSize];
int top;
public:
SeqStack(void){top = 0;}//构造函数
~SeqStack(void);//析构函数
void Push(const DataType item);//入栈
DataType Pop(void);//出栈
DataType GetTop(void)const;//取栈顶数据元素
int NotEmpty(void)const{return(top!=0);}//堆栈非空否,返回1表示非空
}
顺序栈类的操作实现
-
入栈
void SeqStack::Push(const DataType item) { if(top == MaxStackSize){ cout << "堆栈已满" << endl; exit(0); } data[top] == item; top ++; }
-
出栈
DataType SeqStack::Pop() { if(top == 0){ cout << "堆栈已空" << endl; exit(0); } top-- return data[top];//返回被弹出的数据元素 }
-
取栈顶数据元素
DataType SeqStack::GetTop(void)const { if(top == 0){ cout << "堆栈已空" << endl; exit(0); } return data[top - 1]; }
-
测试主程序
#include<iostream> #include<stdlib> const int MaxStackSize = 100; typedef int DataType; void main(void) { SeqStack myStack;//构建函数无参数 DataType test[] = {1, 3, 5, 7, 9}; int n = 5; for(int i = 0; i < n; i++){ myStack.Push(test[i]); } while(myStack.NotEmpty()){ cout << myStack.Pop() << " "; } return 0; } //输出结构应为:9 7 5 3 1
链式堆栈类
链式堆栈:链式存储结构的堆栈
链式栈的存储结构:是以头指针为栈顶,在头指针处插入或删除
结点类定义和实现
template<claas T> class LinStack;//前视定义
template<class T>
class StackNode
{
friend class LinStack<T>
private:
T data;//数据元素
StackNode<T> *next;//指针
public:
//构造函数1
StackNode(StackNode<T> *ptrNext = NULL){
next = ptrNext;
}
//构造函数2,默认指针为null
StackNode(const T& item, StackNode<T> *ptrNext = NULL){
data = item;
next = ptrNext;
}
~StackNode(){}
}
链式堆栈类的定义
template<class T>
class LinStack
{
private:
StackNode<T> *head;//头指针
int size;//数据元素个数
public:
LinStack(void);
~LinStack(void);
void Push(const T& item);
T Pop(void);
T GetTop(void) const;
int NotEmpty(void) const;
}
链式栈类的操作实现
-
构造函数
LinStack<T>::LinStack() { head = new StackNode<T>;//头指针指向头节点 size = 0;//size初始值为0 }
-
析构函数
LinStack<T>::~LinStack(void) { StackNode<T> *p, *q; p = head;//p指向头节点 while(p != NULL){ q = p; p = p->next; delete q; } }
-
堆栈非空否
int LinStack <T>::NotEmpty(void) const { if(size != 0) return 1; else return 0; }
-
入栈
void LinStack<T>::Push(const T& item) { //新结点newNode的data值域为item,next值域为head->next StackNode<T> *newNode = new StackNode<T>(item, head->next); head->next = newNode;//新结点插入栈顶 size++;//元素个数+1 }
-
出栈
T LinStack<T>::Pop(void) { if(size == 0) { cout << "堆栈已空!" << endl; exit(0); } StackNode<T> *p = head->next;//p指向栈顶元素结点 T data = p->data; head->next = head->next->next;//原栈顶元素结点脱链 delete p; size--; return data; }
-
取栈顶元素
T LinStack<T>::GetTop(void) const;//取栈顶元素 { return head->next->data; }
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果