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

文章目录

  • 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 100typedef 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 100typedef 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.mzph.cn/diannao/46426.shtml

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

相关文章

股票质押约定购回:机制、风险与策略!

​股票质押约定购回&#xff1a;机制、风险与策略 在复杂的金融市场中&#xff0c;股票质押约定购回作为一种常见的融资手段&#xff0c;受到了众多投资者和企业的关注。本文将深入探讨股票质押约定购回的定义、运作机制、潜在风险以及投资者和企业在操作时应采取的策略。 一、…

HackChat匿名聊天室

匿名聊天 聊天室地址 这是一款极简、无干扰的聊天应用程序&#xff0c;可以让你专注于交流而不必担心干扰. 频道通过 url 创建、加入和共享&#xff0c;通过更改问号后的文本来创建自己的频道. hack.chat 服务器上不会保留任何消息历史记录&#xff0c;链接断开消息就会删除. …

尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

基于5个K7的多FPGA PCIE总线架构的高性能数据预处理平台

板载FPGA实时处理器&#xff1a;XCKU060-2FFVA15172个QSFP光纤接口&#xff0c;最大支持10Gbps/lane板载DMA控制器&#xff0c;能实现双向DMA高速传输支持x8 PCIE主机接口&#xff0c;系统带宽5GByte/s1个R45自适应千兆以太网口1个FMC子卡扩展接口 基于PCIE总线架构的高性能数据…

DIY系列——自制简易笔记本电脑散热器

前言&#xff1a;为什么要自制笔记本电脑散热器&#xff1f; 夏天到了&#xff0c;电脑的使用频率也在增加。尤其是笔记本电脑&#xff0c;长时间运行后很容易发热&#xff0c;影响性能和寿命。市场上有很多散热器产品&#xff0c;但价格不菲且效果参差不齐。如果你动手能力强…

【原创】springboot+mysql图书共享交流平台设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

C++11空指针类型

C11之前&#xff1a;NULL 在C程序开发中&#xff0c;为了提高程序的健壮性&#xff0c;一般会在定义指针的同时完成初始化操作&#xff0c;或者在指针的指向尚未明确的情况下&#xff0c;都会给指针初始化为NULL&#xff0c;避免产生野指针问题。C98/03 标准中&#xff0c;将一…

gihub配置ssh key

检查本地主机是否已经存在ssh key cd ~/.ssh# 是否存在id_rsa和id_rsa.pub文件&#xff0c;存在则说明已有ssh Key ls生成ssh key ssh-keygen -t rsa -C "Your emailXXX.com"一直回车即可 获取公钥内容&#xff08;id_rsa.pub&#xff09; cd ~/.ssh cat id_rsa…

子数组问题

目录 最大子数组和 环形子数组的最大和 乘积最大子数组 乘数为正数的最长子数组长度 等差数列划分 最长湍流子数组 单词拆分 环绕字符串中唯一的子字符串 声明&#xff1a;接下来主要使用动态规划来解决问题&#xff01;&#xff01;&#xff01; 最大子数组和 题目 …

优化理论——迭代方法

线性回归建模 训练&#xff0c;预测 { ( x ( i ) , y ( i ) ) } \{(x^{(i)},y^{(i)})\} {(x(i),y(i))} ⼀个训练样本&#xff0c; { ( x ( i ) , y ( i ) ) ; i 1 , ⋯ , N } \{(x^{(i)},y^{(i)});i1,\cdots ,N\} {(x(i),y(i));i1,⋯,N} 训练样本集 { ( x 1 ( i ) , x 2 ( i…

Linux 扩展硬盘容量

根分区的硬盘容量不够了需要添加容量 扩展硬盘容量前提是需要虚拟机关机才能进行以下操作 在虚拟中找到虚拟机设置 >> 点击硬盘 >> 选择扩展 >> 输入自已要扩展的大小 >> 确定 这些设置好之后&#xff0c;启动虚拟机 fdisk /dev/sda n p 三个回车…

09、java程序流程控制之一:顺序结构、分支语句(if-else结构)(经典案例以及Scanner类的使用)

java程序流程控制之一&#xff1a; Ⅰ、顺序结构&#xff1a;1、顺序结构简介&#xff1a; Ⅱ、分支语句&#xff1a;if-else1、if-else分支结构&#xff1a;其一、描述&#xff1a;其二、代码为&#xff1a;其三、截图为&#xff1a; 2、如何从键盘获取不同类型的变量&#xf…

Mac Dock栏多屏幕漂移固定的方式

记录一下 我目前的版本是 14.5 多个屏幕&#xff0c;Dock栏切换的方式&#xff1a; 把鼠标移动到屏幕的中间的下方区域&#xff0c;触到边边之后&#xff0c;继续往下移&#xff0c;就能把Dock栏固定到当前屏幕了。

pytorch 是如何调用 cusolver API 的调用

0&#xff0c;环境 ubuntu 22.04 pytorch 2.3.1 x86 RTX 3080 cuda 12.2 1, 示例代码 以potrs为例&#xff1b; hello_cholesk.py """ hello_cholesky.py step1, Cholesky decompose; step2, inverse A; step3, Cholesky again; python3 hello_cholesky.py -…

【Hot100】LeetCode—155. 最小栈

目录 题目1- 思路2- 实现⭐155. 最小栈——题解思路 3- ACM 实现 题目 原题连接&#xff1a;155. 最小栈 1- 思路 思路 最小栈 ——> 借助两个栈来实现 2- 实现 ⭐155. 最小栈——题解思路 class MinStack {Stack<Integer> data;Stack<Integer> min;public …

JVM系列 | 对象的创建与存储

JVM系列 | 对象的生命周期1 对象的创建与存储 文章目录 前言对象的创建过程内存空间的分配方式方式1 | 指针碰撞方式2 | 空闲列表 线程安全问题 | 避免空间冲突的方式方式1 | 同步处理&#xff08;加锁)方式2 | 本地线程分配缓存 对象的内存布局Part1 | 对象头Mark Word类型指针…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 最新华为O…

SqlServer SQL语句或存储过程运行慢 使用 WITH RECOMP ILE 或 OPTION (RECOMPILE)(重新编译)

如果您的存储过程包含参数可以重新申明变量把参数接收下&#xff0c;可能解决你过程执行慢的原因。如果未能解决&#xff0c;请参考以下文章内容&#xff1a; WITH RECOMPILE 子句可以在以下地方使用&#xff1a; 一种是当你创建一个过程时&#xff0c;例如&#xff1a; CREA…

Linux离线安装Mysql5.7

Linux之Mysql安装配置 第一种&#xff1a;Linux离线安装Mysql&#xff08;提前手动下载好tar.gz包&#xff09; 第二种&#xff1a;通过yum安装配置Mysql&#xff08;服务器有网络&#xff09; 之前在阿里云上采用yum安装过一次&#xff08;请看这里&#xff09;&#xff0c;…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现

注&#xff1a;每个学校每个老师对论文的格式要求不一样&#xff0c;故本论文只供参考&#xff0c;本论文页数达到60页以上&#xff0c;字数在6000及以上。 基于SpringBootVueJS微信小程序技术的图书森林共享小程序设计与实现 目录 基于SpringBootVueJS微信小程序技术的图书森…