栈:栈是限定仅能在表尾进行插入和删除操作的线性表。
栈是一种特殊的线性表,它具有线性表的属性即有前驱和后继,但不同于线性表可以在任意位置插入和删除元素,它只能在表尾进行,因此先入的元素会被压入栈底,而后入的元素却会首先被弹出来。因此它是 Last In First Out即后进先出的。
栈的抽象数据类型表示:
ADT 栈(stack)
Data
同线性表,元素具有相同的数据类型,相邻元素具有前驱和后继关系
Operation
InitStack(*S); 初始化操作,建立一个空栈S
DestroyStack(*S); 栈栈存在,则销毁它
ClearStack(*S); 将栈清空
StackEmpty(S); 若栈为空,返回true,否则返回false
GetTop(S,*e); 若栈存在且非空,用e返回S的栈顶元素
Push(*S,e); 若栈S存在,将新元素e插入栈S中并成为栈顶元素
Pop(*S,*e); 删除栈S中栈顶元素,并用e返回其值
StackLength(S); 返回栈S的长度
endADT
顺序栈的代码实现
SqStack.h
/* 顺序栈 */
#define MAXSIZE 5
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int top;
}SqStack;
#define OK 1
#define ERROR 0
typedef int Status;
Status InitStack(SqStack *S); //初始化操作,建立一个空栈S
Status DestroyStack(SqStack *S); //栈栈存在,则销毁它
Status ClearStack(SqStack *S); //将栈清空
int StackEmpty(SqStack S); //若栈为空,返回true,否则返回false
Status GetTop(SqStack S,SElemType *e); //若栈存在且非空,用e返回S的栈顶元素
Status Push(SqStack *S,SElemType e); //若栈S存在,将新元素e插入栈S中并成为栈顶元素
Status Pop(SqStack *S,SElemType *e); //删除栈S中栈顶元素,并用e返回其值
int StackLength(SqStack S); //返回栈S的长度
SqStack.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "SqStack.h"
int main(void)
{
SqStack S;
InitStack(&S);
printf("已初始化好,现在压栈1,2,3,4");
Push(&S,1);
Push(&S,2);
Push(&S,3);
Push(&S,4);
printf("\n现在的长度是:%d\n",StackLength(S));
printf("现在依次弹栈:");
SElemType e ;
Pop(&S,&e);
printf("%d,",e);
Pop(&S,&e);
printf("%d,",e);
Pop(&S,&e);
printf("%d,",e);
Pop(&S,&e);
printf("%d,",e);
printf("\n现在的长度是:%d\n",StackLength(S));
return 0;
}
Status InitStack(SqStack *S) //初始化操作,建立一个空栈S
{
memset(S->data,0,sizeof(SElemType)*MAXSIZE);
S->top = -1;
return OK;
}
Status DestroyStack(SqStack *S) //栈栈存在,则销毁它
{
//free(S);
return OK;
}
Status ClearStack(SqStack *S) //将栈清空
{
S->top = -1;
memset(S->data,0,sizeof(SElemType)*MAXSIZE);
return OK;
}
int StackEmpty(SqStack S) //若栈为空,返回true,否则返回false
{
return S.top == -1;
}
Status GetTop(SqStack S,SElemType *e) //若栈存在且非空,用e返回S的栈顶元素
{
if(StackEmpty(S))
{
return ERROR;
}
*e = S.data[S.top];
return OK;
}
Status Push(SqStack *S,SElemType e) //若栈S存在,将新元素e插入栈S中并成为栈顶元素
{
if(S->top == MAXSIZE -1)
{
return ERROR;//已满
}
S->top++;
S->data[S->top] = e;
return OK;
}
Status Pop(SqStack *S,SElemType *e) //删除栈S中栈顶元素,并用e返回其值
{
if(StackEmpty(*S))
{
return ERROR;//为空
}
*e = S->data[S->top];
S->top--;
return OK;
}
int StackLength(SqStack S) //返回栈S的长度
{
return S.top+1;
}