栈和队列
在栈(Stack)中,被删除的元素是最近添加的元素,所以栈的实现方式是后进先出(Last-in, First-out);
在队列中,被删除的元素是最开始添加的的元素,也就是在动态集合中存放时间最长的那个元素,所以队列的实现方式是先进先出(First-in,First-out)。
栈
在栈的数据结构中,添加元素的操作被称之为入栈(PUSH),删除元素的操作被称之为出栈,也可以称为弹出(POP)。如果栈中不存在任何一个元素,那么这个栈被称为空栈。
栈的抽象数据类型定义
ADT Stack
Data
栈中元素具有相同类型及后进先出特性,
相邻元素具有前驱和后继关系
Operation
InitStack
前置条件:栈不存在
输入:无
功能:栈的初始化
输出:无
后置条件:构造一个空栈
DestroyStack
前置条件:栈已存在
输入:无
功能:销毁栈
输出:无
后置条件:释放栈所占用的存储空间
Push
前置条件:栈已存在
输入:元素值x
功能:在栈顶插入一个元素x
输出:如果插入不成功,抛出异常
后置条件:如果插入成功,栈顶增加了一个元素
Pop
前置条件:栈已存在
输入:无
功能:删除栈顶元素
输出:如果删除成功,返回被删元素值,否则,抛出异常
后置条件:如果删除成功,栈减少了一个元素
GetTop
前置条件:栈已存在
输入:无
功能:读取当前的栈顶元素
输出:若栈不空,返回当前的栈顶元素值
后置条件:栈不变
Empty
前置条件:栈已存在
输入:无
功能:判断栈是否为空
输出:如果栈为空,返回1,否则,返回0
后置条件:栈不变
endADT
链栈
#include<bits/stdc++.h>
struct Node
{
int data;
Node *next;
};
template<class T>
class LinkStack
{
public:
LinkStack()
{
top=NULL;
}
~LinkStack();
void Push(T x);
T Pop();
T GetTop()
{
if(top!=NULL)
return top->data;
}
int Empty()
{
if(top==NULL)
return 1;
else
return 0;
}
private:
Node *top;
};
template<class T>
void LinkStack<T>::Push(T x)///入栈
{
Node *s;
s=new Node;
s->data=x;
s->next=top;
top=s;
}
template<class T>
T LinkStack<T>::Pop()///出栈
{
if(top==NULL)
throw"下溢";
T x;
Node *p;
x=top->data;
p=top;
top=top->next;
delete p;
return x;
}
队列
队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。
空队列:不含任何数据元素的队列。
允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。
队列的操作特性:先进先出(FIFO,LILO)
代码实现
struct Node
{
int n;
Node *next;
};
class linsta
{
Node *first,*last;
public:
linsta();
void pushd(int x);
void popd();
void print()
{
for(Node *i=first->next; i; i=i->next)
{
cout<<i->n<<' ';
}
cout<<endl;
}
};
linsta::linsta()
{
first=new Node;
first->next=NULL;
last=first;
}
void linsta::pushd(int x)
{
Node *s=new Node;
s->n=x;
last->next=s;
last=s;
last->next=NULL;
}
void linsta::popd()
{
Node *j;
if(first->next!=NULL)
{
j=first->next;
first->next=j->next;
delete j;
}
}