1. 程式人生 > >順序棧的基本操作-C語言

順序棧的基本操作-C語言

順序棧的基本操作

具體實現

順序棧的定義

//定義一個順序棧
#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;
}

效果圖
在這裡插入圖片描述

希望該文章能對大家有幫助
同時真誠地接受各位寶貴的評論和建議