顺序栈的实现方式
顺序栈的实现方式
代码结构图
Element.h
typedef struct {
int id;
char * name;
} ElementType;
SeqStack.h
#include <stdio.h>
#include "Element.h"
#include <stdbool.h>
/** 定义栈的顺序存储方式*/
//const int maxsize = 6; //顺序栈的容量
typedef struct Seqstack {
ElementType elements[MAXSIZE]; //顺序栈中存放数据元素的数组
int top; //栈顶下标
int length; //当前栈的元素个数
} SeqStk;
//初始化栈
void InitSeqStack(SeqStk *stk);
//判断栈是否为空
bool EmptyStack(SeqStk *stk);
//进栈
bool PushSeqStack(SeqStk *stk, ElementType element);
//出栈
bool PopSeqStack(SeqStk *stk, ElementType *element);
//获取栈顶元素
ElementType GetTop(SeqStk *stk);
//清空栈
void ClearSeqStack(SeqStk *stk);
SeqStack.c
#include <stdio.h>
#include "SeqStack.h"
#include <stdbool.h>
//初始化栈
void InitSeqStack(SeqStk *stk) {
stk->top = -1;
stk->length = 0;
}
//判断栈是否为空
bool EmptyStack(SeqStk *stk) {
if (stk->top == -1)
return true;
return false;
}
//进栈
bool PushSeqStack(SeqStk *stk, ElementType element) {
//判断栈是否满
if (stk->top == MAXSIZE - 1) {
printf("栈已满,进栈失败!");
return false;
}
stk->top++; //栈未满,栈顶指针+1
stk->elements[stk->top] = element; //新插入元素赋值给栈顶
stk->length++;
return true;
}
//出栈
bool PopSeqStack(SeqStk *stk, ElementType *element) {
//判断栈是否空
if (EmptyStack(stk)) {
printf("空栈,出栈失败!");
return false;
}
*element = stk->elements[stk->top]; //获取栈顶元素
stk->top--; //栈顶top值-1
stk->length--;
return true;
}
//获取栈顶元素
ElementType GetTop(SeqStk *stk) {
if (EmptyStack((stk))) {
printf("空栈,栈顶元素为空!");
}
return stk->elements[stk->top]; //返回栈顶数据元素
}
//清空栈
void ClearSeqStack(SeqStk *stk) {
stk->top = -1;
stk->length = 0;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "Headers/Element.h"
#include "Headers/SeqStack.h"
ElementType datas[] = {
{1, "青花瓷"},
{2, "东风破"},
{3, "发如雪"},
{4, "娘子"},
{5, "菊花台"},
{6, "千里之外"},
};
void TestSeqStack() {
SeqStk *stk = (SeqStk *)malloc(sizeof(SeqStk));
ElementType *element = (ElementType *)malloc(sizeof(ElementType));
//初始化栈
InitSeqStack(stk);
//入栈,并获取入栈后的栈内元素及栈顶元素
printf("准备入栈:\n");
for (int i=0; i<6; i++) {
PushSeqStack(stk,datas[i]);
}
*element = GetTop(stk);
printf("入栈结束,当前栈顶元素是:%d\t%s\n", element->id,element->name);
printf("\n");
for (int i=0; i<stk->length; i++) {
printf("入栈结束,当前栈内元素为:%d\t%s\n",stk->elements[i].id,stk->elements[i].name);
}
printf("\n");
//出栈,并获取出栈元素及栈内元素
printf("准备出栈:\n");
PopSeqStack(stk,element);
printf("出栈结束,当前出栈元素是:%d\t%s\n",element->id,element->name);
printf("\n");
for (int i=0; i<stk->length; i++) {
printf("出栈结束,当前栈内元素为:%d\t%s\n",stk->elements[i].id,stk->elements[i].name);
}
//清除栈,并获取栈顶元素
printf("\n");
printf("清除栈!\n");
ClearSeqStack(stk);
*element = GetTop(stk);
free(stk);
}
int main(void) {
TestSeqStack();
return 0;
}
运行效果图
人生如逆旅
我亦是行人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?