数据结构进阶——使用数组实现栈和队列详解与示例(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语言实现

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#语言实现

csharp 复制代码
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++语言实现

cpp 复制代码
#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语言实现

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# 语言实现

csharp 复制代码
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++语言实现

cpp 复制代码
#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)。

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

相关推荐
不会就选b6 小时前
算法日常・每日刷题--<链表>3
数据结构·算法·链表
2601_951644326 小时前
C语言二级备考指南
c语言·编程基础·编译环境·二级考试·题库选择
稚南城才子,乌衣巷风流8 小时前
块状链表:数据结构详解与实现
数据结构·链表
hold?fish:palm9 小时前
kv存储主从复制的设计与实现
c++·redis·后端
啦啦啦啦啦zzzz9 小时前
算法:贪心算法
c++·算法·leetcode·贪心算法
charlie1145141919 小时前
现代C++工程实践 WeakPtr 实战(三):WeakPtrFactory 与「最后成员」惯用法
开发语言·c++·开源项目·现代c++
吴可可12310 小时前
C#用OpenCVSharp提取轮廓生成CAD多段线
c#
日拱一卒——功不唐捐10 小时前
红黑树删除(C语言)
c语言·数据结构
不如语冰11 小时前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python
JetComXCpp11 小时前
给 Win32 窗口加上毛玻璃效果——纯 D3D11 实现,零依赖
c++