【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

这篇具有很好参考价值的文章主要介绍了【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  堆栈Stack 和 队列Queue是两种非常重要的数据结构,两者都是特殊的线性表:

  • 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行
  • 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。

一、堆栈

1. 定义

  堆栈(简称)是一种操作受限的线性表,只允许在表的同一端进行插入和删除操作,且这些操作是按后进先出的原则进行的。进行插入和删除的一端被称为栈顶,另一端被称为栈底。当栈中无元素时称其为空栈。根据上述定义,每次删除(退栈)的总是最后插入(进栈)的元素。

【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈),数据结构,数据结构,c语言,链表
  如图所示的堆栈中,诸元素以a1,a2,a3,a4,a5的顺序进栈,而退栈的次序则是a5,a4,a3,a2,a1。 也就是说,从栈中取走元素是按后进先出的原则进行的,因此栈又被称作后进先出(Last in First Out)的线性表,简称为LIFO表

2. 基本操作

  • 堆栈是受限的线性表,其基本操作包括
    • push ( ) : 压入一个元素(插入);
    • pop ( ) : 弹出一个元素(删除);
    • peek ( ) : 存取栈顶元素值;
    • clear ( ) : 清空栈;
    • IsEmpty ( ) : 判断栈是否为空;
  • 同普通线性表一样,堆栈也可以用顺序存储和链接存储两种方式来实现:

二、顺序栈

  用顺序存储方式实现的堆栈称为顺序栈

  • 顺序栈用数组存放栈元素,可方便地进行各种栈操作;
  • 某一堆栈的规模指该堆栈最多能容纳的元素个数;
  • 存放堆栈的数组规模(或大小)应按堆栈的规模来确定:
    • 当堆栈中元素的个数达到堆栈规模(简称为栈满)时,则无法再向堆栈插入元素,换言之此时的插入操作将产生上溢出。
  • 如何确保既不上溢也不下溢?
    • 需要一个整型变量size来存放数组规模,以及一个整型变量top来存放栈顶元素在数组中的位置(下标)
      • 当栈为空时,top值为0
      • 每入栈(或出栈)一个元素,top值加1(或减1)
      • 当top等于size时,说明栈满

0. 顺序表

参考前文:顺序表及其基本操作

1. 头文件和常量

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

   #define MAX_SIZE 100
  • 两个头文件
    • stdio.h用于输入输出操作
    • stdlib.h用于内存分配和释放
  • 通过#define指令定义了一个常量MAX_SIZE,它表示栈的最大容量为100

2. 栈结构体

   typedef struct {
       int data[MAX_SIZE];
       int top;
   } Stack;

  使用结构体定义了一个栈的数据结构,data是一个整型数组,用于存储栈中的元素,top表示栈顶的索引。

3. 栈的初始化

   void init(Stack* stack) {
       stack->top = -1;
   }

  初始化栈,将栈顶索引top置为-1,表示栈为空。

4. 判断栈是否为空

   int isEmpty(Stack* stack) {
       return stack->top == -1;
   }

  判断栈是否为空,如果栈顶索引top等于-1,表示栈为空,函数返回1;否则,返回0。

5. 判断栈是否已满

   int isFull(Stack* stack) {
       return stack->top == MAX_SIZE - 1;
   }

  isFull函数用于判断栈是否已满,如果栈顶索引top等于MAX_SIZE - 1,表示栈已满,函数返回1;否则,返回0。

6. 入栈

   void push(Stack* stack, int value) {
       if (isFull(stack)) {
           printf("Stack is full. Cannot push element.\n");
           return;
       }
       stack->data[++stack->top] = value;
   }

  push函数用于将元素入栈,首先判断栈是否已满,如果已满,则打印错误信息并返回;否则,将元素存储在栈顶索引top的位置,并将栈顶索引加1。

7. 出栈

   int pop(Stack* stack) {
       if (isEmpty(stack)) {
           printf("Stack is empty. Cannot pop element.\n");
           return -1;
       }
       return stack->data[stack->top--];
   }

  pop函数用于将栈顶元素出栈,首先判断栈是否为空,如果为空,则打印错误信息并返回-1;否则,返回栈顶元素的值,并将栈顶索引减1。

8. 查看栈顶元素

   int peek(Stack* stack) {
       if (isEmpty(stack)) {
           printf("Stack is empty. Cannot peek element.\n");
           return -1;
       }
       return stack->data[stack->top];
   }

  peek函数用于查看栈顶元素的值,首先判断栈是否为空,如果为空,则打印错误信息并返回-1;否则,返回栈顶元素的值。

9. 清空栈

   void clear(Stack* stack) {
       stack->top = -1;
   }

  clear函数用于清空栈,将栈顶索引top置为-1,表示栈为空。

10. 主函数

int main() {
    Stack stack;
    init(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top element: %d\n", peek(&stack));

    printf("Popped element: %d\n", pop(&stack));
    printf("Popped element: %d\n", pop(&stack));

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    clear(&stack);

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    return 0;
}
  • 声明一个Stack类型的变量stack,然后调用init函数对栈进行初始化。

  • 使用push函数将元素10、20和30依次入栈。

  • 使用peek函数查看栈顶元素的值。

  • 使用pop函数将栈顶的两个元素出栈。

  • 使用isEmpty函数判断栈是否为空。

  • 调用clear函数清空栈。

  • 再次使用isEmpty函数判断栈是否为空。

【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈),数据结构,数据结构,c语言,链表文章来源地址https://www.toymoban.com/news/detail-722378.html

11. 代码整合

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

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void init(Stack* stack) {
    stack->top = -1;
}

int isEmpty(Stack* stack) {
    return stack->top == -1;
}

int isFull(Stack* stack) {
    return stack->top == MAX_SIZE - 1;
}

void push(Stack* stack, int value) {
    if (isFull(stack)) {
        printf("Stack is full. Cannot push element.\n");
        return;
    }
    stack->data[++stack->top] = value;
}

int pop(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot pop element.\n");
        return -1;
    }
    return stack->data[stack->top--];
}

int peek(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot peek element.\n");
        return -1;
    }
    return stack->data[stack->top];
}

void clear(Stack* stack) {
    stack->top = -1;
}

int main() {
    Stack stack;
    init(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top element: %d\n", peek(&stack));

    printf("Popped element: %d\n", pop(&stack));
    printf("Popped element: %d\n", pop(&stack));

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    clear(&stack);

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    return 0;
}

到了这里,关于【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】实现顺序表基本的操作(数据结构)

    在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构

    2024年02月03日
    浏览(52)
  • 【数据结构】顺序表基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(55)
  • 数据结构教程实验一顺序表基本操作的实现

    1.掌握线性表的顺序存贮结构及基本操作,深入了解顺序表的基本特性,以便在实际问题背景下灵活运用它们。 2.深入理解和灵活掌握顺序表的插入、删除等操作。 1.硬件:每个学生需配备计算机一台。 2.软件:Windows操作系统+Visual C++。     1.将建表、遍历、插入、删除分别

    2024年02月07日
    浏览(45)
  • 【数据结构】 顺序栈的基本操作 (C语言版)

    目录 一、顺序栈 1、顺序栈的定义: 2、顺序栈的优缺点 二、顺序栈的基本操作算法(C语言)    1、宏定义  2、创建结构体 3、顺序栈的初始化  4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺序栈的判满  10、求顺序栈长度 11、顺

    2024年01月24日
    浏览(52)
  • 数据结构:线性表顺序存储结构———顺序表

    目录 顺序表的定义 初始化线性表 销毁线性表 求线性表的长度 判断是否为空表 插入数据元素 逻辑序号与物理序号的区别 删除数据元素 输出线性表  按序号求线性表中的元素 按元素值查找 整体上创建顺序表 顺序表实验 线性表的顺序存储是把线性表中的所有元素按照其逻辑

    2024年02月03日
    浏览(46)
  • 基于C语言的数据结构之顺序表——带你熟练掌握顺序表基本操作!!超级详细!!

    目录 前言: 1.源代码如下 2.数据结构——顺序表    2.1.顺序表的特点    2.2顺序表的分类     2.2.1.动态分配内存的顺序表     2.2.2.静态分配内存的顺序表    2.3.定义一个顺序表 3.顺序表的基本操作    3.1初始化顺序表     不用将顺序表中可能存在的原有元素初始化吗?

    2024年04月26日
    浏览(41)
  • 【玩转408数据结构】线性表——定义和基本操作

            线性表是算法题命题的重点,该类题目实现相对容易且代码量不高,但需要最优的性能(也就是其时间复杂度以及空间复杂度最优),这样才可以获得满分。所以在考研复习中,我们需要掌握线性表的基本操作,在平时多进行代码练习。当然在考场上,我们并不一

    2024年02月19日
    浏览(47)
  • 数据结构:定长顺序串(SString)基本操作的算法描述(C语言)

    作者在学习数据结构时,发现鲜有完全按照 C 语言描述的算法操作,这让习惯于写 .c 而不是 .cpp 的初学者很是头疼。本文将基于 C 语言描述算法操作,如有错漏还望大佬们指正。 本文将按照严惠敏所著《数据结构(C语言版)》所做的函数原型声明进行算法描述,由于C语言不支

    2024年02月07日
    浏览(72)
  • 【数据结构】线性结构 之 顺序表

    🌱博客主页:大寄一场. 🌱系列专栏:数据结构与算法 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 目录 前言 顺序表概念及结构 静态代码实现: 动态代码实现: SeqList.h文件 SeqList.c文件 test.c文件 本章节博主将会带领大家了解数据结构的 线性结构的顺序表 。 提到线性

    2024年02月06日
    浏览(44)
  • c语言数据结构——链表的实现及其基本操作

    顺序表的问题及思考 问题: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有数据插

    2023年04月09日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包