一、什麼是棧
棧是一種先進後出的數據結構,英文last in first out(LIFO),又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱爲棧頂,相對地,把另一端稱爲棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素。
棧可以有兩種方式實現,一種是順序存儲,一種是鏈式存儲,下面就來說一下兩種方式的實現。
二、棧的順序存儲結構
關於函數定義要用到的一些宏:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int Status;
typedef int ElemType;
首先定義構成棧的結構體:
typedef int ElemType;
typedef int Status; //下面函數的定義會用到
typedef struct {
ElemType *base; /* 棧底指針 */
ElemType *top; /* 棧頂指針 */
int stackSize; /* 當前已分配的存儲空間,以元素爲單位 */
}SqStack;
- 空棧與棧滿
- 構造一個空棧
Status InitStack(SqStack *S)
{
S -> base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S -> base)
return ERROR;
S -> top = S -> base; /* 空棧的棧頂與棧底相等 */
S -> stackSize = STACK_INIT_SIZE;
return OK;
}
- 向棧中插入新的元素
Status Push(SqStack *S,ElemType elem)
{
if(S -> top - S -> base >= S -> stackSize) /* 判斷棧是否已滿 */
{
ElemType *ptr = (ElemType *) realloc(S -> base,(S -> stackSize + STACK_INCREMENT) * sizeof(ElemType));
if(!ptr)
return ERROR;
S -> base = ptr;
S -> top = S -> base + S -> stackSize;
S -> stackSize += STACK_INCREMENT;
}
*(S -> top) = elem;
S -> top++;
return OK;
}
- 彈出棧頂元素
Status Pop(SqStack *S,ElemType *elem)
{
if(S -> top == S -> base) /* 空棧 */
return ERROR;
*elem = *(S -> top - 1);
S -> top--;
return OK;
}
- 從棧頂往下打印棧中的數據
void PrintSqStack(SqStack *S)
{
ElemType *p = S -> top;
while(p != S -> base) {
printf("%d ",*(p-1));
p--;
}
printf("\n");
}
- 獲取棧的長度
int GetSqStacklength(SqStack *S)
{
if(!S -> base)
return ERROR;
return S -> top - S -> base
}
- 判斷棧是否爲空
Status CheckEmpty(SqStack *S)
{
if(!S -> base)
return ERROR;
if(S -> base == S -> top)
return TRUE;
else
return FALSE;
}
- 銷燬棧
Status DestoryStack(SqStack *S)
{
if(!S ->base)
return ERROR;
free(S -> base);
S -> base = NULL;
S -> top = NULL;
S -> stackSize = 0;
return OK;
}
- 置空棧
Status CheckEmpty(SqStack *S)
{
if(!S->base)
return ERROR;
if( S->top == S->base)
return TRUE;
else
return FALSE;
}
在搞清楚棧的存儲結構後,相關操作其實很好寫出來;
下面是實現的程序:
頭文件:
#ifndef _SQSTACK_H_
#define _SQSTACK_H_
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int Status;
typedef int ElemType;
typedef int ElemType;
typedef int Status; //下面函數的定義會用到
typedef struct {
ElemType *base; /* 棧底指針 */
ElemType *top; /* 棧頂指針 */
int stackSize; /* 當前已分配的存儲空間,以元素爲單位 */
}SqStack;
Status InitStack(SqStack *S);
Status Push(SqStack *S,ElemType elem);
Status Pop(SqStack *S,ElemType *elem);
void PrintSqStack(SqStack *S);
int GetSqStacklength(SqStack *S);
Status CheckEmpty(SqStack *S);
int DestoryStack(SqStack *S);
Status ClearStack(SqStack *S);
#endif /* ----- #ifndef _SQSTACK_H_ ----- */
主程序:
#include "SqStack.h"
int main(int argc, char *argv[])
{
SqStack S;
SqStack *ps = &S;
int elem = 0;
int i;
InitStack(ps); /* 初始化棧 */
for(i = 1; i <= 50; i++) /* 賦值 */
{
Push(ps,i);
}
printf("length:%d\n",GetSqStacklength(ps)); /* 打印棧的長度 */
Pop(ps,&elem); /* 獲取棧頂元素 */
printf("elem = %d\n",elem);
PrintSqStack(ps); /* 打印棧中所有數據 */
ClearStack(ps); /* 置空棧 */
printf("length:%d\n",GetSqStacklength(ps));
return 0;
}
打印結果:
今天就先總結到這裏啦!