顺序栈的基本操作-C语言

版权声明:Sock的blog, 可以偷看但不可以偷走哦 https://blog.csdn.net/qq_42957923/article/details/85173796

顺序栈的基本操作

具体实现

顺序栈的定义

//定义一个顺序栈
#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;
}

效果图
在这里插入图片描述

希望该文章能对大家有帮助
同时真诚地接受各位宝贵的评论和建议

猜你喜欢

转载自blog.csdn.net/qq_42957923/article/details/85173796