赞
踩
线性顺序表(数组)
线性顺序表(链表)
Python风格双向链表的实现
散列表简单实现(hash表)
栈和队列的应用
二叉树之一(数组存储)
二叉树之二(二叉搜索树)
二叉树之三(二叉搜索树扩展)
图结构入门
C++ 是一种面向对象的编程语言,它提供了多种数据结构,前面文章已介绍过数组、链表、hash表,并用自己的方法实现。用于存储和操作数据的结构在STL中还有很多,其中两种常用的数据结构是栈和队列。本文将介绍栈和队列的概念,特点,实现方式和应用场景。
栈是一种后进先出(LIFO)的数据结构,它只允许在一端(称为栈顶)进行插入和删除操作。栈可以用数组或链表来实现。C++ 标准库中提供了一个模板类 std::stack,可以方便地创建和使用栈对象。栈的基本操作有:
栈的应用场景有:
例如每日一练中的逆波兰表达式(RPN)。RPN是一种不需要括号的数学表达式,它使用操作符后置的方式来表示运算顺序。例如,表达式 2 + 3 * 4 可以写成 2 3 4 * +。为了计算RPN表达式,我们可以使用一个栈来存储操作数和操作符。每当遇到一个操作数,我们就把它压入栈中;每当遇到一个操作符,我们就从栈中弹出两个操作数,进行相应的运算,并把结果压入栈中。最后,栈中剩下的元素就是表达式的值:
#include <iostream> #include <string> #include <stack> #include <sstream> using namespace std; int solution(int n, std::string arr){ int result; // TODO: stringstream ss(arr); stack<int> s; //创建一个空栈 string input; //输入的字符串 while (ss >> input){ if (input == "+"){ //如果输入是加号 int a = s.top(); s.pop(); //弹出栈顶操作数 int b = s.top(); s.pop(); s.push(a + b); //把两个操作数相加的结果压入栈中 } else if (input == "-"){ //如果输入是减号 int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push(b - a); } else if (input == "*"){ //如果输入是乘号 int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push(a * b); } else if (input == "/"){ //如果输入是除号 int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push(b / a); } else { //如果输入是其他字符,认为是一个整数 s.push(std::stoi(input)); //把输入转换成整数并压入栈中 } } result = s.top(); //输出最终结果 return result; } int main() { int n; std::string arr = "3 4 - 5 +"; int result = solution(n, arr); std::cout<<result<<std::endl; return 0; }
队列是一种先进先出(FIFO)的数据结构,它只允许在一端(称为队尾)进行插入操作,在另一端(称为队首)进行删除操作。队列可以用数组或链表来实现。C++ 标准库中提供了一个模板类 std::queue,可以方便地创建和使用队列对象。队列的基本操作有:
队列的应用场景有:
下面是一个使用C++和队列(queue)实现的简单BFS搜索例子:
#include <iostream> #include <queue> using namespace std; int main(){ queue<int> q; int graph[4][4] = { {0, 1, 1, 0}, {0, 0, 1, 0}, {1, 0, 0, 1}, {0, 0, 0, 1} }; bool visited[4] = {false}; q.push(0); visited[0] = true; while (!q.empty()){ int v = q.front(); q.pop(); cout << v << " "; for (int i = 0; i < 4; i++){ if (graph[v][i] == 1 && !visited[i]){ q.push(i); visited[i] = true; } } } return 0; }
上面的代码中,我们定义了一个二维数组graph来表示图。graph[i][j]为1表示顶点i和顶点j之间有一条边。我们还定义了一个布尔数组visited来记录每个顶点是否已经被访问过。
在函数中,我们首先将起始顶点(顶点0)加入队列,并将其标记为已访问。然后,我们进入一个循环,直到队列为空。在每次循环中,我们从队列的前端取出一个顶点v,并输出它。接着,我们遍历与顶点v相邻的所有顶点,如果这些顶点尚未被访问过,则将它们加入队列,并将它们标记为已访问。
总之,C++ 栈和队列是两种常用的数据结构,它们有各自的特点和适用场景。掌握它们的概念,特点,实现方式和应用场景,对于提高编程能力和解决实际问题都有很大帮助。
栈和队列的实现比较容易,用数组就能模拟一个,这里就简单的介绍了一下如何灵活使用。至此就写完了常用的C++内置数据结构了,以后再写树和图。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。