栈:栈是限定仅能在表尾进行插入和删除操作的线性表。
栈是一种特殊的线性表,它具有线性表的属性即有前驱和后继,但不同于线性表可以在任意位置插入和删除元素,它只能在表尾进行,因此先入的元素会被压入栈底,而后入的元素却会首先被弹出来。因此它是 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; }