[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作
阿新 • • 發佈:2019-02-14
最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別
/*
棧的抽象資料型別
ADT 棧(stack)
Data
同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係
Operation
InitStack(*S):初始化操作,建立一個空棧S
DestroyStack(*S):若棧存在,則銷燬它
ClearStack(S):將棧清空
StackEmpty(S):若棧為空,返回true,否則返回false
GetTop(S,*e):若棧存在且非空,用e返回S的棧頂元素
Push(S,e):若棧存在,插入新元素e到棧S中併成為棧頂元素
Pop(S,*e):刪除棧S中棧頂元素,並用e返回其值
StackTraverse(S):遍歷棧中所有元素
StackLength(S):從棧頂遍歷所有元素
endADT
*/
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -1
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}*PLinkStack;
/*初始化棧*/
Status InitStack(PLinkStack *S)
{
*S = (PLinkStack)malloc(sizeof(struct LinkStack));
(*S)->top = NULL;
(*S)->count = 0 ;
return OK;
}
/*清空棧*/
Status ClearStack(PLinkStack S)
{
LinkStackPtr p;
while(S->top){
p = S->top;
S->top = S->top->next;
S->count--;
free(p);
}
return OK;
}
/*銷燬棧*/
Status DestroyStack(PLinkStack *S)
{
ClearStack(*S);
free(*S);
return OK;
}
/*判斷棧是否為空*/
Status StackEmpty(PLinkStack S)
{
if(S->top)/*棧存在且非空*/
return FALSE;
else
return TRUE;
}
/* 若棧存在且非空,用e返回S的棧頂元素 */
Status GetTop(PLinkStack S,SElemType *e)
{
if(!S->top)return ERROR;
*e = S->top->data;
return OK;
}
/*入棧*/
Status Push(PLinkStack S,SElemType *e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(struct StackNode));
p->data = *e;
p->next = S->top;
S->top = p;
S->count++;
return OK;
}
/*出棧*/
Status Pop(PLinkStack S,SElemType *e)
{
LinkStackPtr p;
if(!GetTop(S,e))return ERROR;
p = S->top;
S->top = S->top->next;
S->count--;
free(p);
return OK;
}
/*檢視棧元素個數*/
int StackLength(PLinkStack S)
{
return S->count;
}
/*遍歷棧中所有元素*/
Status StackTraverse(PLinkStack S,Status (* visit)(SElemType))
{
LinkStackPtr p;
p = S->top;
while(p){
visit(p->data);
p = p->next;
}
printf("\n");
return OK;
}
/*顯示元素格式*/
Status visit(SElemType e)
{
printf("%d ",e);
return OK;
}
int main()
{
SElemType e,i;
PLinkStack s;
printf("InitStack初始化棧並將1--12壓入棧\n");
if(InitStack(&s))
for(e = 1; e <= 12; e++)
{
Push(s,&e);
}
printf("StackTraverse棧中元素從棧頂依次為:\n");
StackTraverse(s,visit);
Pop(s,&e);
printf("Pop彈出的元素為:%d\n",e);
Pop(s,&e);
printf("Pop又彈出的元素為:%d\n",e);
printf("Push將剛剛彈出的元素%d再次壓入\n",e);
Push(s,&e);
printf("StackEmpty判斷棧是否為空:%d(1:是 0:不是)\n",StackEmpty(s));
GetTop(s,&e);
printf("GetTop當前棧頂元素為:%d\n",e);
printf("StackLength:當前棧長度為%d \n",StackLength(s));
ClearStack(s);
printf("ClearStack棧清空後,StackEmpty棧是否為空%d(1:是 0:不是)\n",StackEmpty(s));
DestroyStack(&s);
printf("DestroyStack棧銷燬");
return 0;
}