数据结构进阶——使用数组实现栈和队列详解与示例(C,C#,C++)

news2024/9/23 13:27:07

文章目录

  • 1、数组实现栈
    • 栈的基本操作
    • C语言实现
    • C#语言实现
  • 2、 数组实现队列
    • 队列的基本操作
    • C语言实现
    • C# 语言实现
    • C++语言实现
  • 总结

在这里插入图片描述


在编程世界中,数据结构是构建高效算法的基石。栈和队列作为两种基本的数据结构,它们的应用非常广泛。本文将带领大家使用C,C#和C++三种编程语言,通过数组来实现栈和队列,并提供详细的代码示例。

1、数组实现栈

栈是一种后进先出(Last In First Out, LIFO)的数据结构。使用数组实现栈的基本思路如下:

  • 定义一个数组来存储栈中的元素。
  • 定义一个变量来表示栈顶位置。

栈的基本操作

  1. 初始化:创建一个固定大小的数组,并将栈顶位置初始化为-1。
  2. 入栈(push):将元素放入栈顶,并将栈顶位置加1。
  3. 出栈(pop):移除栈顶元素,并将栈顶位置减1。
  4. 查看栈顶元素(peek):返回栈顶元素,但不移除它。
  5. 判断栈是否为空(isEmpty):如果栈顶位置为-1,则栈为空。
  6. 判断栈是否满(isFull):如果栈顶位置等于数组长度-1,则栈满。

C语言实现

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

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

void initializeStack(Stack *s) {
    s->top = -1;
}

bool isFull(Stack *s) {
    return s->top == MAX_SIZE - 1;
}

bool isEmpty(Stack *s) {
    return s->top == -1;
}

void push(Stack *s, int value) {
    if (isFull(s)) {
        printf("栈已满,无法入栈\n");
        return;
    }
    s->data[++s->top] = value;
}

int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("栈为空,无法出栈\n");
        return -1;
    }
    return s->data[s->top--];
}

int peek(Stack *s) {
    if (isEmpty(s)) {
        printf("栈为空\n");
        return -1;
    }
    return s->data[s->top];
}

int main() {
    Stack s;
    initializeStack(&s);
    push(&s, 10);
    push(&s, 20);
    printf("栈顶元素:%d\n", peek(&s));
    printf("出栈元素:%d\n", pop(&s));
    return 0;
}

C#语言实现

using System;

public class Stack {
    private int[] data;
    private int top;
    private int maxSize;

    public Stack(int size) {
        maxSize = size;
        data = new int[maxSize];
        top = -1;
    }

    public bool IsFull() {
        return top == maxSize - 1;
    }

    public bool IsEmpty() {
        return top == -1;
    }

    public void Push(int value) {
        if (IsFull()) {
            Console.WriteLine("栈已满,无法入栈");
            return;
        }
        data[++top] = value;
    }

    public int Pop() {
        if (IsEmpty()) {
            Console.WriteLine("栈为空,无法出栈");
            return -1;
        }
        return data[top--];
    }

    public int Peek() {
        if (IsEmpty()) {
            Console.WriteLine("栈为空");
            return -1;
        }
        return data[top];
    }
}

class Program {
    static void Main() {
        Stack s = new Stack(100);
        s.Push(10);
        s.Push(20);
        Console.WriteLine("栈顶元素:" + s.Peek());
        Console.WriteLine("出栈元素:" + s.Pop());
    }
}

C++语言实现

#include <iostream>
#include <vector>
using namespace std;

class Stack {
private:
    vector<int> data;
    int top;
    int maxSize;

public:
    Stack(int size) : maxSize(size), top(-1) {
        data.resize(maxSize);
    }

    bool isFull() const {
        return top == maxSize - 1;
    }

    bool isEmpty() const {
        return top == -1;
    }

    void push(int value) {
        if (isFull()) {
            cout << "栈已满,无法入栈" << endl;
            return;
        }
        data[++top] = value;
    }

    int pop() {
        if (isEmpty()) {
            cout << "栈为空,无法出栈" << endl;
            return -1;
        }
        return data[top--];
    }

    int peek() const {
        if (isEmpty()) {
            cout << "栈为空" << endl;
            return -1;
        }
        return data[top];
    }
};

int main() {
    Stack s(100);
    s.push(10);
    s.push(20);
    cout << "栈顶元素:" << s.peek() << endl;
    cout << "出栈元素:" << s.pop() << endl;
    return 0;
}

2、 数组实现队列

队列是一种先进先出(First In First Out, FIFO)的数据结构。使用数组实现队列的基本思路如下:

  • 定义一个数组来存储队列中的元素。
  • 定义两个变量分别表示队列头部和尾部。

队列的基本操作

  1. 初始化:创建一个固定大小的数组,并将队列头部和尾部位置初始化为0。
  2. 入队(enqueue):在队列尾部添加元素,并将尾部位置加1。
  3. 出队(dequeue):移除队列头部元素,并将头部位置加1。
  4. 查看队列头部元素(front):返回队列头部元素,但不移除它。
  5. 判断队列是否为空(isEmpty):如果头部和尾部位置相同,则队列为空。
  6. 判断队列是否满(isFull):如果尾部位置等于数组长度,则队列满。

C语言实现

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

typedef struct Queue {
    int data[MAX_SIZE];
    int front;
    int rear;
} Queue;

void initializeQueue(Queue *q) {
    q->front = 0;
    q->rear = 0;
}

bool isFull(Queue *q) {
    return (q->rear + 1) % MAX_SIZE == q->front;
}

bool isEmpty(Queue *q) {
    return q->rear == q->front;
}

void enqueue(Queue *q, int value) {
    if (isFull(q)) {
        printf("队列已满,无法入队\n");
        return;
    }
    q->data[q->rear] = value;
    q->rear = (q->rear + 1) % MAX_SIZE;
}

int dequeue(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空,无法出队\n");
        return -1;
    }
    int value = q->data[q->front];
    q->front = (q->front + 1) % MAX_SIZE;
    return value;
}

int front(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
        return -1;
    }
    return q->data[q->front];
}

int main() {
    Queue q;
    initializeQueue(&q);
    enqueue(&q, 10);
    enqueue(&q, 20);
    printf("队首元素:%d\n", front(&q));
    printf("出队元素:%d\n", dequeue(&q));
    return 0;
}

C# 语言实现

using System;

public class Queue {
    private int[] data;
    private int front;
    private int rear;
    private int maxSize;

    public Queue(int size) {
        maxSize = size;
        data = new int[maxSize];
        front = 0;
        rear = 0;
    }

    public bool IsFull() {
        return (rear + 1) % maxSize == front;
    }

    public bool IsEmpty() {
        return rear == front;
    }

    public void Enqueue(int value) {
        if (IsFull()) {
            Console.WriteLine("队列已满,无法入队");
            return;
        }
        data[rear] = value;
        rear = (rear + 1) % maxSize;
    }

    public int Dequeue() {
        if (IsEmpty()) {
            Console.WriteLine("队列为空,无法出队");
            return -1;
        }
        int value = data[front];
        front = (front + 1) % maxSize;
        return value;
    }

    public int Front() {
        if (IsEmpty()) {
            Console.WriteLine("队列为空");
            return -1;
        }
        return data[front];
    }
}

class Program {
    static void Main() {
        Queue q = new Queue(100);
        q.Enqueue(10);
        q.Enqueue(20);
        Console.WriteLine("队首元素:" + q.Front());
        Console.WriteLine("出队元素:" + q.Dequeue());
    }
}

C++语言实现

#include <iostream>
#include <vector>
using namespace std;

class Queue {
private:
    vector<int> data;
    int front;
    int rear;
    int maxSize;

public:
    Queue(int size) : maxSize(size), front(0), rear(0) {
        data.resize(maxSize);
    }

    bool isFull() const {
        return (rear + 1) % maxSize == front;
    }

    bool isEmpty() const {
        return rear == front;
    }

    void enqueue(int value) {
        if (isFull()) {
            cout << "队列已满,无法入队" << endl;
            return;
        }
        data[rear] = value;
        rear = (rear + 1) % maxSize;
    }

    int dequeue() {
        if (isEmpty()) {
            cout << "队列为空,无法出队" << endl;
            return -1;
        }
        int value = data[front];
        front = (front + 1) % maxSize;
        return value;
    }

    int front() const {
        if (isEmpty()) {
            cout << "队列为空" << endl;
            return -1;
        }
        return data[front];
    }
};

int main() {
    Queue q(100);
    q.enqueue(10);
    q.enqueue(20);
    cout << "队首元素:" << q.front() << endl;
    cout << "出队元素:" << q.dequeue() << endl;
    return 0;
}

总结

本文通过C、C#和C++三种语言的示例,详细介绍了如何使用数组来实现栈和队列这两种基本的数据结构。通过这些示例,我们可以看到,虽然不同的编程语言有着不同的语法和特性,但它们在实现基本数据结构时的核心思想和步骤是相似的。

  • 栈 的实现主要依赖于一个简单的数组和一个指示栈顶位置的变量。它的主要操作包括入栈(push)、出栈(pop)和查看栈顶元素(peek)。
  • 队列 的实现则需要两个变量来分别跟踪队列的头部和尾部。队列的主要操作包括入队(enqueue)、出队(dequeue)和查看队首元素(front)。

在实际应用中,数组实现的栈和队列可能在性能上不是最优的选择,特别是在动态调整大小或者频繁进行插入和删除操作时。但是,它们是理解更复杂数据结构和算法的基础,也是锻炼编程技能的良好起点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OrangePi AIpro】: 探索AI加成的开源硬件魅力

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Orange Pi: 探索开源硬件的魅力引言Orange Pi概述OrangePi AIPro产品介绍试用体…

STM32第二十课:FreeRTOS任务管理和信号量

目录 一、任务管理方式二、任务堆栈溢出检测三、二值信号量&#xff08;任务同步&#xff09;四、计数信号量五、互斥信号量六、队列 一、任务管理方式 1.任务创建成功后会添加到就绪链表中&#xff0c;开启调度器&#xff0c;此时任务调度器会去就绪链表中找优先级最高的任务执…

数据增强新方法SUMix:解决Mixup混合后的图像的内容与其标签不匹配问题

数据增强新方法SUMix&#xff1a;解决Mixup混合后的图像的内容与其标签不匹配问题 提出背景当前混合方法的问题MixUp 操作标签混合混合交叉熵&#xff08;MCE&#xff09;混合交叉熵&#xff08;MCE&#xff09;的核心作用混合交叉熵&#xff08;MCE&#xff09;的功能 CutMix原…

$accumulator(聚合)

$accumulator 是 MongoDB 聚合管道中用于自定义数据处理逻辑的一个算子&#xff0c;它允许用户使用 JavaScript 编写代码来控制数据的初始化、累积、合并和最终输出。下面是对 $accumulator 各个部分的详细解释&#xff1a; init: 这是一个 JavaScript 函数&#xff0c;用于初…

数据结构回顾(Java)

1.数组 线性表 定义的方式 int[] anew int[10] 为什么查询快&#xff1f; 1.可以借助O(1)时间复杂度访问某一元素&#xff0c; 2.地址连续&#xff0c;逻辑连续 3.数组长度一旦确定就不可以被修改 当需要扩容的时候需要将老数组的内容复制过来 在Java中数组是一个对象 Ar…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

国内体外诊断行业翘楚『迈克生物』SRM项目启动,企企通赋能IVD产业打造高效采购供应链体系

IVD行业&#xff08;体外诊断行业&#xff09;在医疗领域被誉为“医生的眼睛”&#xff0c;是现代检验医学的重要构成部分&#xff0c;在临床应用中贯穿了疾病预防、初步诊断、治疗方案选择、疗效评价等疾病治疗的全过程&#xff0c;在现代医学疾病诊断中发挥着重要作用。 随着…

springboot1——快速构建项目

需求 第一步&#xff1a;创建maven工程(非web项目) 第二步&#xff1a;导入起步依赖 点击&#xff1a; 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xff01;这是springboot工程需要继承的父工程 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xf…

JAVA:常用的链表指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 链表是一种常见的数据结构&#xff0c;它通过一系列节点&#xff08;Node&#xff09;来表示一个序列。每个节点包含数据和指向下一个节点的引用。链表的种类有很多&#xff0c;包括…

网络文件系统—NFS

目录 一、概述 二、NFS挂载原理 三、NFS相关协议及软件安装管理 1.协议&#xff1a; 2.软件&#xff1a; 四、NFS系统守护进程 五、NFS服务器的配置 六、NFS服务器的启动与停止 1. 启动NFS服务器 2.查询NFS服务器状态 3.停止NFS服务器 4.设置NFS服务器的自动启动状…

games103作业2(未完)

PBD方法 首先是每个质点的力的分析&#xff0c;不考虑碰撞和弹簧弹力的情况下&#xff0c;每个质点受重力的影响&#xff0c;所以需要对每个质点进行速度和位置的重力影响更新。 float t 0.0333f; float damping 0.99f; int[] E; float[] L; Vector3[] V; Vector3 gra…

【数学建模】——数学规划模型

目录 一、线性规划&#xff08;Linear Programming&#xff09; 1.1 线性规划的基本概念 1.2 线性规划的图解法 模型建立&#xff1a; 二、整数规划&#xff08;Integer Programming&#xff09; 2.1 整数规划的基本概念 2.2 整数规划的求解方法 三、非线性规划&#x…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2139张 标注数量(xml文件个数)&#xff1a;2139 标注数量(txt文件个数)&#xff1a;2139 标注类别数&#xff1a;8 标注类别名称&#xff1a;[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

220V降压5ⅤIC-AH8652

220V降压至5V的IC - AH8652 在电子设计中&#xff0c;电压转换是一个常见的需求&#xff0c;尤其是在需要将高电压转换为低电压以供电给微电子设备时。AH8652是一款专为降压转换设计的集成电路&#xff0c;它能够将220V的交流输入电压转换为稳定的5V直流输出&#xff0c;非常适…

Camunda如何通过外部任务与其他系统自动交互

文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表&#xff1a; Camunda组件与服务与…

spring6之容器:IOC

容器&#xff1a;IOC 控制反转&#xff08;Ioc&#xff09; IoC容器在Spring的实现 Spring 的 IoC 容器就是 IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫做 bean。在创建 bean 之前&#xff0c;首先需要创建IoC 容器。Spring 提供了IoC 容器的两种实现方式&#xf…

华为HCIP Datacom H12-821 卷39

1.填空题 请2001 :0DB8:0000:C030:0000: 000: 09A0:CDEF地址进行压缩。() (若答案中存在字母&#xff0c;请采用大写格式) 参考答案&#xff1a;2001 :DB8:0:C030: :9A0:CDEF 解析&#xff1a; IPv6地址的表示方法 IPv6地址总长度为128比特&#xff0c;通常分为8组&#xff0c…

防御综合实验作业2

办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP NAT策略&#xff1a; 安全策略&#xff1a; 测试&#xff1a; 分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 是怎么转换的&#xff0c;首先分公司的用户需…

温度如何影响输入失调电压

目录 一、概念理解 二、仿真理解 一、概念理解 在手册中有这样一个参数&#xff1a;输入失调电压漂移&#xff08;input offset voltage drift / offset drift&#xff09; 以上图为例&#xff0c;这个参数理解为&#xff1a;常温下&#xff08;25℃&#xff09;每增减1摄氏度…

【STM32开发笔记】搭建VSCode+PyOCD的STM32开发环境

【STM32开发笔记】搭建VSCodePyOCD的STM32开发环境 一、安装软件1.1 安装STM32CubeMX1.2 安装VSCode1.3 安装Arm GNU Toolchain1.4 安装Make for Windows1.5 安装Python1.6 安装PyOCD 二、安装插件2.1 VSCode插件2.2 PyOCD支持包 三、创建项目3.1 创建STM32CubeMX项目3.2 查阅原…