数据结构2.1-栈(数组)

栈(数组)

1.何为

栈可以看成是一种特殊的线性表,但是这种线性表的删除与插入都只在一端进行,此处,我们称为栈顶,而不进行操作的一段称为栈底
此处我们给出栈的示意图

栈顶(top)→  [元素4]  ← 最后入栈的元素
             [元素3]
             [元素2]
             [元素1]
栈底(bottom)[元素0]  ← 最先入栈的元素

此处我们可以直观知道先入栈的元素在栈底,后入栈的元素在栈顶,而元素必须先入栈才能出栈,同时元素必须在栈顶才能出栈,否则会被上面的元压着出不去,此处我们可以联想成一个有限长度的、仅允许一人进出的有限通道
此处我们就不使用伪代码示意了,直接结合C语言代码来说明

2.栈的操作

栈的操作有:入栈出栈(退栈)取栈顶元素判栈空/满

2.1初始化

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10         //定义栈的最大容量

//初始化栈
typedef struct {
    int data[MAX_SIZE];      // 定义存储栈元素的数组
    int top;                 // 定义栈顶指针
} stack;

2.2入栈

if (stack.top == MAX_SIZE - 1) {
        printf("栈已满,请先出栈n");
    } else {
        stack.data[stack.top + 1] = 1;      //写入一个元素,若果想要批量写入则循环即可
        stack.top++;                        //栈顶指针加1
        printf("入栈成功n");
    }

注意: 1.写入数据时务必判栈满,即对应代码if (stack.top == MAX_SIZE – 1)…,栈满则无法写入数据

  1. 元素入栈后务必移动栈顶指针代表栈的实际容量增加,否则会丢失数据
    3.其次,我们操作时请务必使用栈顶指针,不要直接在索引上操作,否则会有一些奇奇怪怪的问题,同时也不符合栈的逻辑

2.3出栈(退栈)

if (stack.top == -1) {
        printf("栈已空,请先入栈n");
    } else {
        printf("出栈元素为%dn", stack.data[stack.top]);
        stack.top--;
    }

注意: 1.出栈时务必判栈空,即对应代码if (stack.top == -1)…,栈空则无法进行出栈操作

  1. 出栈时务必移动栈顶指针代表栈的实际容量减少,否则会丢失数据
    3.其次,我们操作时请务必使用栈顶指针,不要直接在索引上操作,否则会有一些奇奇怪怪的问题,同时也不符合栈的逻辑
    (我是专业的CV程序员嘿嘿^▽^)
    同时,我在学习的时候有一个疑问,我出栈不用把出去的那个元素的索引归零吗,查阅资料后得到以下回答:
    不需要将出栈元素的索引位置归零,出栈操作的核心是移动栈顶指针,当栈顶指针减1后,该位置的元素在逻辑上已不在栈中,后续入栈会直接覆盖该位置的数据

2.4取栈顶元素以及遍历栈

if (stack.top == -1) {
        printf("栈已空,请先入栈n");
    } else {
        printf("栈顶元素为%dn", stack.data[stack.top]);
        printf("栈中元素个数为%dn", stack.top + 1);
        printf("栈中元素为:n");
        for (int i = 0; i <= stack.top; i++) {
            printf("%dn", stack.data[i]);
            printf("n");
        }
    }

注意: 1.取栈顶元素时务必判栈空,即对应代码if (stack.top == -1)…,栈空则无法进行取栈顶元素操作
2.好像没了

3.结

以上就是用数组实现栈的一些示例了,还是比较简单的,用链表来模拟栈就要头疼了(@_@;),我会尽力学习然后写出来的
完整代码可以在同文件夹下的./stackDemo1.c中找到,博客的话会把代码附在评论区
感谢支持!

评论

  1. 博主
    2 月前
    2025-12-24 16:30:38
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_SIZE 10         //定义栈的最大容量
    
    //初始化栈
    typedef struct {
        int data[MAX_SIZE];      // 定义存储栈元素的数组
        int top;                 // 定义栈顶指针
    } stack;
    
    int main() {
        stack stack;            //声明我的栈
        stack.top = -1;         //初始化栈顶指针为-1表示栈空
    
        //入栈
        if (stack.top == MAX_SIZE - 1) {
            printf("栈已满,请先出栈\n");
        } else {
            stack.data[stack.top + 1] = 1;      //写入一个元素,若果想要批量写入则循环即可
            stack.top++;                        //栈顶指针加1
            printf("入栈成功\n");
        }
    
        //出栈(退栈)
        if (stack.top == -1) {
            printf("栈已空,请先入栈\n");
        } else {
            printf("出栈元素为%d\n", stack.data[stack.top]);
            stack.top--;
        }
    
        //取栈顶元素
        if (stack.top == -1) {
            printf("栈已空,请先入栈\n");
        } else {
            printf("栈顶元素为%d\n", stack.data[stack.top]);
            printf("栈中元素个数为%d\n", stack.top + 1);
            printf("栈中元素为:\n");
            for (int i = 0; i <= stack.top; i++) {
                printf("%d\n", stack.data[i]);
                printf("\n");
            }
        }
    }
    

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
皖ICP备2025092305号-1