順序棧的基本操作-C語言
阿新 • • 發佈:2018-12-22
順序棧的基本操作
具體實現
順序棧的定義
//定義一個順序棧
#define STACK_INIT_SIZE 100
#define INCREMENT 10
typedef int ElemType;
typedef struct {
ElemType* base;
ElemType* top;
int stacksize;
}SqStack;
建立一個順序表
//建立一個順序表
void InitStack(SqStack* S) {
S->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType) );
if (!S->base) {
exit(0);
}
//棧頂指向棧底
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
}
順序表的入棧操作
//入棧操作
void Push(SqStack* S, ElemType e) {
//判斷棧是否已滿
if (S->top - S->base >= STACK_INIT_SIZE) {
SqStack q;
q.base = (ElemType*)realloc(S->base, (S->stacksize + INCREMENT) * sizeof(SqStack));
if (!q.base) {
exit(0);
}
S->base = q.base;
//更新top指標的指向
S->top = S->base + S->stacksize;
S->stacksize += INCREMENT;
}
*(S->top)++ = e;
}
順序表的出棧操作
//出棧操作
ElemType Pop(SqStack* S) {
//判斷棧是否為空
if (S->top == S->base) {
//printf("棧為空\n");
return 0;
}
--S->top;
return *S->top;
}
銷燬順序棧
//銷燬一個棧
void DestroyStack(SqStack* S) {
free(S->base);
S->base = S->top = NULL;
S->stacksize = 0;
}
清空一個棧
//清空一個棧
void ClearStack(SqStack* S) {
S->top = S->base;
}
計算當前棧的長度
//計算當前棧的容量
int StackLen(SqStack S) {
return S.top - S.base;
}
測試
#include <stdio.h>
#include <windows.h>
/*
用順序表實現一個順序棧
*/
//定義一個順序棧
#define STACK_INIT_SIZE 100
#define INCREMENT 10
typedef int ElemType;
typedef struct {
ElemType* base;
ElemType* top;
int stacksize;
}SqStack;
//建立一個順序表
void InitStack(SqStack* S) {
S->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!S->base) {
exit(0);
}
//棧頂指向棧底
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
}
//入棧操作
void Push(SqStack* S, ElemType e) {
//判斷棧是否已滿
if (S->top - S->base >= STACK_INIT_SIZE) {
SqStack q;
q.base = (ElemType*)realloc(S->base, (S->stacksize + INCREMENT) * sizeof(SqStack));
if (!q.base) {
exit(0);
}
S->base = q.base;
//更新top指標的指向
S->top = S->base + S->stacksize;
S->stacksize += INCREMENT;
}
*(S->top)++ = e;
}
//出棧操作
ElemType Pop(SqStack* S) {
//判斷棧是否為空
if (S->top == S->base) {
//printf("棧為空\n");
return 0;
}
--S->top;
return *S->top;
}
//銷燬一個棧
void DestroyStack(SqStack* S) {
free(S->base);
S->base = S->top = NULL;
S->stacksize = 0;
}
//清空一個棧
void ClearStack(SqStack* S) {
S->top = S->base;
}
//計算當前棧的容量
int StackLen(SqStack S) {
return S.top - S.base;
}
int main() {
SqStack s1;
InitStack(&s1);
for (int i = 0; i < 5; ++i) {
Push(&s1, i + 1);
}
int len = StackLen(s1);
for (int i = 0; i < len; ++i) {
printf("%d ", Pop(&s1));
}
printf("\n");
DestroyStack(&s1);
if (!s1.base) {
printf("OK\n");
}
system("pause");
return 0;
}
效果圖
希望該文章能對大家有幫助
同時真誠地接受各位寶貴的評論和建議