顺序栈的实现方式

顺序栈的实现方式

代码结构图

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;
}

运行效果图

image

posted @   相遇就是有缘  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
  1. 1 我记得 赵雷
  2. 2 北京东路的日子 汪源
  3. 3 把回忆拼好给你 王贰浪
我记得 - 赵雷
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示