版权声明: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;
}
效果图
希望该文章能对大家有帮助
同时真诚地接受各位宝贵的评论和建议