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日

相关文章

  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java Concurrency集合之LinkedBlockingDeque_动力节点Java学院整理 LinkedBlockingDeque是什么? LinkedBlockingDeque是java.util.concurrent包下一个双向阻塞队列,用于在多线程的环境中处理元素序列,它支持在队列两端添加和移除元素。LinkedBlockingDeque可…

    数据结构 2023年5月17日
    00
  • SQL Injection with MySQL 注入分析

    SQL Injection (SQL注入)是一种常见的网络攻击技术,攻击者通过输入一定格式的恶意SQL语句,利用程序没有对用户输入进行校验或者过滤的漏洞,来获取数据库中的数据或者执行非授权的操作。本文将针对MySQL数据库漏洞进行讲解,介绍常见的攻击方法和防御策略。 SQL Injection with MySQL 注入分析 攻击方法 错误的输入验证 攻击者…

    数据结构 2023年5月17日
    00
  • Python内存管理器如何实现池化技术

    Python内存管理器使用了池化技术来进行内存管理,这使得Python程序的内存管理效率比较高。下面我将详细介绍Python内存管理器如何实现池化技术: 1. 内存分配 Python内存管理器在Python运行时,会维护多个大小不同的内存块池,每个池的大小相同。当Python程序需要分配内存时,会首先在池中寻找是否有剩余内存块可以分配。如果有,则分配给程序使…

    数据结构 2023年5月17日
    00
  • R语言数据结构之矩阵、数组与数据框详解

    R语言数据结构之矩阵、数组与数据框详解 在R语言中,矩阵、数组和数据框是常见的数据结构。本文将从定义、创建、访问和操作等方面详细讲解这些数据结构。 矩阵(matrix) 定义 矩阵是R语言中的一种二维数据结构,所有的元素都必须是同一类型的,并且矩阵中的行列数必须相同。矩阵可以使用matrix函数创建。 创建 # 创建一个3行4列的矩阵,所有元素都为0 mat…

    数据结构 2023年5月17日
    00
  • C#中的数据结构介绍

    C#中的数据结构介绍 什么是数据结构? 数据结构是数据的组织、存储和管理方式。在计算机科学中,数据结构是指数据的组织形态。 C# 中常见的数据结构 在 C#中,常用的数据结构有以下几种。 1. 数组 数组是一种存储固定大小的相同类型元素的顺序集合。在 C# 中数组可以是单维、多维或交错的,并且数组支持索引和 LINQ 查询操作。在创建数组时需要指定数组的大小…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表存储详解

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

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘二 线性结构

    C#数据结构与算法揭秘二 线性结构 线性结构是指数据元素之间一对一的关系,即数据元素之间存在一个前驱和一个后继。一般有两种基本形式:线性表和栈、队列。 线性表 线性表是由同类型数据元素构成有序序列的线性结构,常被用于实现基于数组的数据结构,如向量、矩阵等。 线性表可以分为顺序表和链表两种。 顺序表(Sequence List):是把线性表的元素按照顺序存储在…

    数据结构 2023年5月17日
    00
  • 字符串算法–$\mathcal{KMP,Trie}$树

    \(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth、Morris\)和\(Pratt\)对该算法进行了改进,称为 \(KMP\) 算法。 而\(KMP\)的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有…

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