堆栈,是具有一定操作约束的线性表,只在一端(栈顶,Top)做插入,删除。
插入数据:入栈
删除数据:出栈
后入先出
堆栈的抽象数据类型描述
类型名称:堆栈
数据对象集:一个有0个或多个元素的有穷线性表
操作集:长度为MAXSIZE的堆栈s∈Stack,堆栈元素item∈ElementType
1.Stack CreatStack(int MAXSIZE):
生成空堆栈,其最大长度为MAXSIZE
2.int IsFull(Stack S,int MAXSIZE):
判断堆栈s是否已满
3.void Push(Stack S,ElementType item):
将元素item压入栈
4.int IsEmpty(Stack S):
判断堆栈S是否为空
5.ElementType Pop(Stack S)
删除并返回栈顶元素
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成
1.创建结构体
#define MAXSIZE 100
typedef struct SNode* Stack;
struct SNode{
ElementType Data[MAXSIZE];
int top;
};
2.入栈
//入栈
void Push(Stack Ptrs/*一个结构体指针*/,ElementType item/*要入的元素*/)
{
if(Ptrl->top=MAXSIZE-1) printf("栈满"); return;
else Ptrl->Data[++Ptrl->top]=item; return;
}
3.出栈
//出栈
ElmentType Pop(Stack Ptrs)
{
if(Ptrs->top==-1) printf("栈空"); return ERROR;
else return (Ptrl->Data[(Ptrl->Pop)--]);
}
用一个数组实现两个堆栈时,使这两个栈分别从数组的两头开始生长;当两个栈指针相遇了,表示栈满。(这样可以最大利益数组空间。使数组只要有空间,入栈就可以成功
1.创建结构体
#define MAXSIZE 100
struct DStack
{
ElementType Data[MAXSIZE];
int top1;//栈1的栈顶指针
int top2;
}s;
s.top1=-1;
s.top2=MAXSIZE;//定为空
2.堆栈
//堆栈
void Push(struct DStack* Ptrs,ElementType item,int Tag)
{// Tag作为区分两个堆栈的标志,取值为1或2
if(Ptrs->top2-Ptrs->top1==1) printf("堆栈满"); return;
if(Tag==1){
Ptrs->Data[++(Ptrs->top1)]=item;
}else{
Ptrs->Data[++(Ptrs->top2)]=item;
}
}
3.出栈
//出栈
ElementType Pop(struct DStack* Ptrs ,int Tag)
{
if(Tag==1){
if(Ptrs->top1=-1) printf("堆栈1空"); return NULL;
else return Ptrs->Data[(Ptrs->Top1)--];
}else{
if(Ptrs->top2=MAXSIZE) printf("堆栈2空"); return NULL;
else return Ptrs->Data[(Ptrs->Top2)++];
}
}