棧的順序存儲結構實現
用數組來實現棧,首先定義棧類型SqStack,里面有兩個指針,一個指向棧底,這個棧底初始化后將被指向數組指針,即第一個數組元素。而另一個一個指針指向棧頂,隨着新元素不斷被push進來,棧頂指針不斷往上漲如何判斷滿棧了呢,那就要用到SqStack里面的第三個元素stacksize,它指明占空間的大小,即讓top指針減去base指針的差去和stacksize比較,如果大於棧空間,則需要重新分配數組大小。同樣對於棧的pop則將棧頂元素索取出來並讓top減1,如下圖所示,top的位置總是數據的上面,所以棧頂的數據應該是top-1。先檢測top是否和base相等,因為這是空棧的條件,如果不等,則top必然在base上面,且棧不為空,top-1的位置就當然是棧頂的元素位置。對於獲取棧中的數據長度,就是讓top-base就可以了。
圖示:棧的狀態示意圖
示例代碼
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef struct
{
SElemType *base; /* 在棧構造之前和銷毀之后,base值為NULL */
SElemType *top; /* 棧頂指針 */
int stacksize; /* 當前已分配的存儲空間,以元素為單位 */
}SqStack;
/* 構造一個空戰 */
Status InitStack(SqStack *S)
{
S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S->base)
return ERROR;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
/* 銷毀棧S,S不再存在 */
Status DestoryStack(SqStack *S)
{
if(!S->base)
return ERROR;
free(S->base);
S->base = NULL;
S->top = NULL;
S->stacksize = 0;
return OK;
}
/* 把棧S置為空棧 */
Status ClearStack(SqStack *S)
{
if(!S->base)
return ERROR;
S->top = S->base;
return OK;
}
/* 如果棧為空則返回TRUE,否則返回FALSE */
Status StackEmpty(SqStack *S)
{
if(!S->base)
return ERROR;
if( S->top == S->base)
return TRUE;
else
return FALSE;
}
/* 返回棧的長度 */
int StackLength(SqStack *S)
{
if(!S->base)
return ERROR;
return S->top - S->base;
}
/* 若棧不為空,則用e返回S的棧頂元素,並返回OK,否則返回ERROR */
Status GetTop(SqStack *S, SElemType *e)
{
if(!S->base || S->top == S->base)
return ERROR;
*e = *(S->top-1);
return OK;
}
/* 插入元素e為新的棧頂 */
Status Push(SqStack *S, SElemType e)
{
if( S->top - S->base >= S->stacksize ) { /* 棧滿,追加存儲空間 */
SElemType * ptr = (SElemType *)realloc( S->base,
(S->stacksize + STACK_INCREMENT)*sizeof(SElemType) );
if(!ptr)
return ERROR;
S->base = ptr;
S->top = S->base + S->stacksize; /* top重新指向新的地址 */
S->stacksize += STACK_INCREMENT;
}
*(S->top) = e;
S->top++;
return OK;
}
/* 若棧不空,則彈出棧頂元素,用e保存返回值 */
Status Pop(SqStack *S,SElemType *e)
{
if(S->top == S->base) /* 棧空了 */
return ERROR;
*e = *(S->top-1);
S->top--;
return OK;
}
/* 從棧頂往下打印棧中的數據 */
void printSqStack(SqStack *S)
{
SElemType * p = S->top;
while (p != S->base) {
printf("%d ",*(p-1));
p--;
}
printf("\n");
}
int main()
{
SqStack S;
SqStack * pS = &S;
SElemType e;
// 初始化棧
InitStack(pS);
// push 測試
for(int i=1;i<=110;i++) {
Push(pS,i);
}
// 獲取棧長度測試
printf("len %d\n",StackLength(pS));
// 彈出棧頂
Pop(pS,&e);
printf("pop %d\n",e);
// 打印棧測試
printSqStack(pS);
// 獲取棧頂測試
GetTop(pS,&e);
printf("top %d\n",e);
// 銷毀測試
DestoryStack(pS);
printf("\nreturn 0\n");
}