从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)

简介: 从C语言到C++_18(stack和queue的常用函数+相关练习)力扣

1. stack

1.1 栈的概念

数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)_GR C的博客-CSDN博客

① 栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素的操作。

② 进行数据插入的删除和操作的一端,称为栈顶 。另一端则称为 栈底 。

③ 栈中的元素遵守后进先出的原则,即 LIFO原则(Last In First Out)。

压栈:栈的插入操作叫做 进栈 / 压栈 / 入栈 ,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

1.2 stack 的介绍和使用

https://cplusplus.com/reference/stack/stack/?kw=stack

stack 是一种容器适配器,(下一篇会讲解)专门用在具有后进先出操作的上下文环境中,


其删除只能从容器的一端进行 元素的插入与提取操作。

stack 是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,


并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,


元素特定容器的尾部(即栈顶)被压入和弹出。

标准容器 vector、deque、list 均符合这些需求,默认情况下,


如果没有为 stack 指定特定的底层容器, 则使用 deque。

stack 的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,


这些容器类应该支持以下操作:


empty:判空操作

back:获取尾部元素操作

push_back:尾部插入元素操作

pop_back:尾部删除元素操作

看看接口函数:

通过观察文档我们发现,接口相较于之前的 string、vector 和 list 少了很多。

它甚至连拷贝构造和析构都没有自己实现,然而这些都得益于容器适配器的使用。

不难发现, stack、queue 也没有迭代器,这也不难理解,

毕竟能让你随便遍历,不就破坏了栈和队列的原则了。

常用函数:

简单使用:

#include <iostream>
#include <stack>
using namespace std;
 
void test_stack() 
{
    stack<int> st;
    st.push(1);
    st.push(2);
    st.push(3);
    st.push(4); 
    st.push(5);
 
    cout <<  "st.size() = " << st.size() << endl;
    while (!st.empty()) 
    {
        cout << st.top() << " "; // 后进先出
        st.pop();
    }
    cout << endl;
}
 
int main()
{
    test_stack();
    return 0;
}

2. queue

2.1 队列的概念

数据结构与算法⑨(第三章_下)队列的概念和实现(力扣:225+232+622)_GR C的博客-CSDN博客

① 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。② 入队列,进行插入操作的一端称为 队尾。出队列,进行删除操作的一端称为 队头。

③ 队列中的元素遵循先进先出的原则,即 FIFO 原则(First In First Out)

2.2 queue 的介绍和使用

https://cplusplus.com/reference/queue/queue/

队列是一种容器适配器,(下一章会讲解)专门用于在FIFO上下文(先进先出)中操作,


其中从容器一端插入元素,另一端 提取元素。

队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,


queue 提供一组特定的 成员函数来访问其元素。元素从队尾入队列,从队头出队列。

标准容器类 deque 和 list 满足了这些要求。默认情况下,


如果没有为 queue 实例化指定容器类,则使用标准容器 deque。

底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。


该底层容器应至少支持以下操作:

empty:检测队列是否为空

size:返回队列中有效元素的个数

front:返回队头元素的引用

back:返回队尾元素的引用

push_back:在队列尾部入队列

pop_front:在队列头部出队列

常用函数:

简单使用:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
 
void test_stack() 
{
    stack<int> st;
    st.push(1);
    st.push(2);
    st.push(3);
    st.push(4); 
    st.push(5);
 
    cout <<  "st.size() = " << st.size() << endl;
    while (!st.empty()) 
    {
        cout << st.top() << " "; // 后进先出
        st.pop();
    }
    cout << endl;
}
 
void test_queue()
{
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);
    q.push(5);
 
    cout << "q.size() = " << q.size() << endl;
    while (!q.empty())
    {
        cout << q.front() << " "; // 先进先出
        q.pop();
    }
    cout << endl;
}
 
int main()
{
    test_stack();
    test_queue();
 
    return 0;
}

3. 栈和队列的相关选择题

1. 下列代码的运行结果是( )

void main()
{
  stack<char> S;
  char x, y;
  x = 'n';y = 'g';
  S.push(x);S.push('i');S.push(y);
  S.pop();S.push('r');S.push('t');S.push(x);
  S.pop();S.push('s');
  while (!S.empty())
  {
    x = S.top();
    S.pop();
    cout << x;
  };
  cout << y;
}

A.gstrin

B.string

C.srting

D.stirng

2. 下列代码的运行结果是( )

void main()
{
  queue<char> Q;
  char x, y;
  x = 'n';y = 'g';
  Q.push(x);Q.push('i');Q.push(y);
  Q.pop();Q.push('r');Q.push('t');Q.push(x);
  Q.pop();Q.push('s');
  while (!Q.empty())
  {
    x = Q.front();
    Q.pop();
    cout << x;
  };
  cout << y;
}

A.gstrin

B.grtnsg

C.srting

D.stirng

3. 一个栈的输入顺序是a,b,c,d,e则下列序列中不可能是出栈顺序是( )

A.e,d,a,c,b

B.a,e,d,c,b

C.b,c,d,a,e

D.b,c,a,d,e

4. 以下是一个tree的遍历算法,queue是FIFO队列,请参考下面的tree,正确的输出是( )

       1

 2         3

4 5        6 7

queue.push(tree.root )

while(true)


node = queue.pop()


output(node.value)//输出节点对应数字


if(null==node)


break


for(child_node in node.children)


queue.push(child_node)


A.1376254


B.1245367


C.1234567


D.1327654

答案:

1. B

分析:S.push(x);S.push('i');S.push(y); 入栈了字母“nig”  左边栈底 右边栈顶


 S.pop();S.push('r');S.push('t');S.push(x); 字母g出栈,然后入栈字母“rtn”,此时栈数据      为"nirtn"


 S.pop();S.push('s');字母n出栈,s入栈,最终的栈数据为nirts


  while(!S.empty()){} 栈不空出栈打印,按相反顺讯出栈,所以打印结果为:strin


 cout<<y;最后还打印了字母g


2. B


分析:Q.push(x);Q.push('i');Q.push(y); 入队数据为:nig 左边对头,右边队尾


  Q.pop();Q.push('r');Q.push('t');Q.push(x); n出队,rtn入队,队里数据为:igrtn


  Q.pop();Q.push('s'); i出队,s入队,队里数据为:grtns


  while(!Q.empty()){} 队不空,在出队打印为:grtns


  cout<<y; 最后在打印一个g


3. A


分析:首先此题要保证入栈的顺序不能改变,其次,某个字母出栈前,必须把其栈顶的元素都要出栈


A:e要先出栈,就必须把a b c d e 全部入栈,然后e才能出栈,对于e d 的出栈没有问题,只是a要出栈,就必须c d 先出栈后,才能轮到a出栈,因此A是不可能得到的出栈顺序,其他答案可以自行验证


4. C


分析:此题是一个层次遍历的伪代码,能够看出是层次遍历,其结果就迎刃而解

从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(中):https://developer.aliyun.com/article/1521377

目录
相关文章
|
2月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
899 0
|
4月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
172 26
|
4月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
296 15
|
10月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
507 23
|
5月前
|
Java C++
力扣第一道困难题《3. 无重复字符的最长子串》,c++
首先我们看到这个题是肯定有一种暴力的硬解思路的,那就是将两个vector直接链接起来,然后再排序后,直接返回中间值,这个方法实现起来还是非常容易的,
102 0
|
9月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
304 1
一文彻底搞清楚C语言的函数
|
10月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
419 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
|
10月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
194 24
|
10月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
483 16
|
10月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
336 3