C++数据结构深入探究栈与队列

C++数据结构深入探究栈与队列

简介

栈和队列是常见的数据结构,尤其在程序设计和算法中都是不可或缺的。本文将深入讲解C++中栈和队列的实现原理和基本操作,并提供两个示例说明其应用。

栈(Stack)基本操作

栈的定义

栈是一种线性数据结构,具有后进先出(Last In First Out, LIFO)的特点。栈可以用数组或链表实现。

栈的操作

  • push() 在栈顶插入元素
  • pop() 弹出栈顶元素
  • top() 返回栈顶元素
  • empty() 判断栈是否为空
  • size() 返回栈中元素个数

栈示例

#include <iostream>
#include <stack>

using namespace std;

int main() {
    stack<int> s;
    s.push(1); // 在栈顶插入元素1
    s.push(2); // 在栈顶插入元素2
    s.push(3); // 在栈顶插入元素3

    cout << s.top() << endl; // 输出栈顶元素3
    s.pop(); // 弹出栈顶元素3

    cout << s.top() << endl; // 输出栈顶元素2

    return 0;
}

队列(Queue)基本操作

队列的定义

队列是一种线性数据结构,具有先进先出(First In First Out, FIFO)的特点。队列可以用数组或链表实现。

队列的操作

  • push() 在队列尾部插入元素
  • pop() 弹出队列头部元素
  • front() 返回队列头部元素
  • back() 返回队列尾部元素
  • empty() 判断队列是否为空
  • size() 返回队列中元素个数

队列示例

#include <iostream>
#include <queue>

using namespace std;

int main() {
    queue<int> q;
    q.push(1); // 在队列尾部插入元素1
    q.push(2); // 在队列尾部插入元素2
    q.push(3); // 在队列尾部插入元素3

    cout << q.front() << endl; // 输出队列头部元素1
    q.pop(); // 弹出队列头部元素1

    cout << q.front() << endl; // 输出队列头部元素2

    return 0;
}

示例一:栈的应用

下面是一个计算后缀表达式的示例程序。后缀表达式是指运算符在后面的数学表达式,例如3 4 +表示3+4。

该程序使用栈来实现后缀表达式的计算,首先将后缀表达式转换成栈,然后依次取出并计算其中的元素,最终得到结果。

#include <iostream>
#include <stack>
#include <cstring>

using namespace std;

double evaluatePostfix(char* postfix) {
    stack<double> s;
    double result = 0;

    for(int i = 0; i < strlen(postfix); i++) {
        if(postfix[i] >= '0' && postfix[i] <= '9') {
            s.push(postfix[i] - '0');
        }
        else {
            double operand2 = s.top();
            s.pop();
            double operand1 = s.top();
            s.pop();

            switch(postfix[i]) {
                case '+':
                    result = operand1 + operand2;
                    break;

                case '-':
                    result = operand1 - operand2;
                    break;

                case '*':
                    result = operand1 * operand2;
                    break;

                case '/':
                    result = operand1 / operand2;
                    break;
            }

            s.push(result);
        }
    }

    return result;
}

int main() {
    char postfix[] = {'3', '4', '+', '5', '*'};
    cout << evaluatePostfix(postfix) << endl; // 输出27

    return 0;
}

示例二:队列的应用

下面是一个实现循环队列的示例程序。循环队列是指先进先出(FIFO)的数据结构,在头尾相连的环形数组中存储数据。

该程序使用数组实现循环队列,并演示了入队和出队操作的基本方法。

#include <iostream>
#include <queue>

using namespace std;

const int QUEUE_SIZE = 10;

void enqueue(int queue[], int& rear, int value) {
    if((rear + 1) % QUEUE_SIZE == 0) {
        cout << "队列已满" << endl;
    }
    else {
        rear = (rear + 1) % QUEUE_SIZE;
        queue[rear] = value;
    }
}

void dequeue(int queue[], int& front) {
    if(front == -1) {
        cout << "队列为空" << endl;
    }
    else {
        front = (front + 1) % QUEUE_SIZE;
    }
}

int main() {
    int queue[QUEUE_SIZE];
    int front = -1;
    int rear = -1;

    enqueue(queue, rear, 1);
    enqueue(queue, rear, 2);
    enqueue(queue, rear, 3);
    dequeue(queue, front);
    dequeue(queue, front);

    cout << queue[front] << endl; // 输出队列头部元素3

    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++数据结构深入探究栈与队列 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月25日
    00
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解 什么是单链表 链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。 单链表节点的定义 单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。 以下是单链表节点的定义: typedef struct node { i…

    数据结构 2023年5月17日
    00
  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解

    解析从源码分析常见的基于Array的数据结构动态扩容机制的详解 什么是动态扩容机制 动态扩容机制是指,当一个数据结构达到其容量限制时,自动增加容量大小以继续存储新的数据。在动态扩容时,需要考虑到时间和空间的平衡,因为扩容需要分配新的内存空间,在处理大量数据时,需要尽可能减少空间浪费和分配内存的时间消耗。 基于Array的数据结构 Array是一种连续存储的数…

    数据结构 2023年5月17日
    00
  • Redis底层数据结构详解

    Redis底层数据结构详解 前言 Redis是一款开源的,高性能的,基于内存的数据结构存储系统。Redis支持多种数据结构,包括简单的键值对、列表、集合、有序集合等等。本篇文章将深入分析Redis的底层数据结构,介绍它们的原理、优缺点和适用场景。 1. 哈希表(Hash Table) 哈希表是Redis中最常用的底层数据结构之一。可以通过以下命令在Redis…

    数据结构 2023年5月17日
    00
  • Redis的六种底层数据结构(小结)

    Redis的六种底层数据结构(小结) 简介 Redis是一种基于内存的高效键值存储数据库,它支持六种不同的数据结构来存储数据。这些结构旨在提供高速、灵活和功能强大的一系列功能。在学习Redis时,了解这些数据结构可以帮助您更好地使用Redis并更好地解决您的问题。 Redis的六种底层数据结构 Redis支持以下六种不同的数据结构: String (字符串)…

    数据结构 2023年5月17日
    00
  • C语言链表案例学习之通讯录的实现

    让我详细讲解一下“C语言链表案例学习之通讯录的实现”的完整攻略。 1. 案例简介 本案例的目的是通过实现一个简单的通讯录程序,来学习C语言链表的原理和操作。程序主要功能涵盖通讯录添加、删除、修改以及查询。 2. 程序架构 程序的整体结构如下所示: 头文件声明 结构体定义 函数声明 主函数 函数实现 其中,头文件声明包含stdio.h、stdlib.h以及st…

    数据结构 2023年5月17日
    00
  • 如何配置git环境

    首先我们新建一个文件夹;    然后我们右键git Bash Here一下;在里面输入: cd ssh-keygen cd.ssh ls (注意,我们要是之前就生成过密钥,直接输入ls就好了) 输入ls之后,会显示出来我们的公钥,我们输入: cat id_rsa.pub 然后密钥就出来了,密钥出来之后,我们把密钥复制一下,打开github 选择设置; 中会有…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部