首页 > 编程语言 >【剑指 Offer】用两个栈实现队列(C++_Easy_栈/队列)

【剑指 Offer】用两个栈实现队列(C++_Easy_栈/队列)

时间:2023-06-20 11:35:54浏览次数:39  
标签:deleteHead q2 appendTail Offer 队列 CQueue C++ int


1. 题目

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

2. 示例

2.1 示例 1

输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]

2.2 示例 2

输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

3. 提示

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

4. 题解

题解一:两个栈实现队列

class CQueue {
public:
    stack<int> q1, q2;
    CQueue() {
        while(!q1.empty())
            q1.pop();
        while(!q2.empty())
            q2.pop();
    }
    void appendTail(int value) {
        q1.push(value);
    }
    int deleteHead() {
        if(q2.empty()){
            while(!q1.empty()){
                q2.push(q1.top());
                q1.pop();
            }
        }
        if(q2.empty()){
            return -1;
        }
        int t=q2.top();
        q2.pop();
        return t;
    }
};

题解二:用现有队列结构实现功能

class CQueue {
public:
    queue<int> q;
    CQueue() {
    }
    void appendTail(int value) {
        q.push(value);
    }
    int deleteHead() {
        if(q.empty())
            return -1;
        else{
            int temp=q.front();
            q.pop();
            return temp;
        }
    }
};

题解三:用数组实现队列

class CQueue {
public:
    int v[20010], top=0, tail=0;
    CQueue() {
    }
    void appendTail(int value) {
        v[tail]=value;
        tail++;
    }
    int deleteHead() {
        if(top==tail)
            return -1;
        top++;
        return v[top-1];
    }
};


标签:deleteHead,q2,appendTail,Offer,队列,CQueue,C++,int
From: https://blog.51cto.com/u_16165815/6521634

相关文章

  • 【计算机算法设计与分析】6-5 最小重量机器设计问题(C++_回溯法/分支限界法)
    问题描述设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。设计一个优先队列式分支限界法,给出总价格不超过d的最小重量机器设计。对于给定的机器部件重量和机器部件价格,设计一个优先队列式分......
  • 【蓝桥杯_真题演练】换零钞(C++_遍历)
    题目x星球的钞票的面额只有:100元,5元,2元,1元,共4种。小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,剩下的当然都是5元面额的。银行的工作人员有点为难,你能帮助算出:在满足小......
  • 线性结构中的栈、队列和串是怎么回事?
    一.栈1.栈的概念栈(stack)是一种操作受限的线性表,栈的操作被限定在线性表的尾部进行,栈结构有两个特殊概念:栈顶:栈的尾部被称为栈顶(Top);栈底:另一端固定不动,被称为栈底(Bottom)。栈中的元素只能先入后出。最早进入栈的元素所在的位置是栈底,最后进入栈的元素所在的位置是......
  • 【蓝桥杯_真题演练】第九届C/C++省赛B组_C-乘积尾零(C++_数论)
    Problem如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?56504542355447394641143871907390432927587949611356595245743230514434670435949937117368663397475975573070228714539899148657223135117040145510512072928809......
  • PTA_乙级_1015 德才论(C++_模拟_快排)
    宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入格式:输入第一行给出3个......
  • P3371 【模板】单源最短路径(弱化版)(C++_SPFA算法_链式向前星)
    题目背景本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步P4779。题目描述如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。输入格式第一行包含三个整数n,m,s,分别表示点的个数、有向边的个数、出发点的编号。接下来m行每行包含三个......
  • C++ primer plus学习之第二章
    1.引用:intival=1024;int&refval=ival;//正确,refval时ival的别名int&re;//错误,引用必须被初始化int&ii=42;//错误:不能为非常量引用绑定字面值constint&ii=42;//正确:可以为常量引用绑定字面值2.初始化空指针int*p=0;int*p=NULL;int*p=nullptr;//最好用这个任何非零指......
  • 总结C++中#include<>和#include""的区别
    查找目录不同1、#include<>编译器直接从系统类库目录里查找头文件比如在vs中,使用#include<>编译器会直接在vs安装目录下在编译器自带的库文件中进行搜索。如果类库目录下查找失败,编译器会终止查找,直接报错:Nosuchfileordirectory.如果我们自定义一个头文件"aaa.h",将其放在......
  • CCF_201912-1 报数(C++_模拟)
    思路代码可能写的有点啰嗦冗余,写的时候有点急写完一节就直接复制粘贴了蛤蛤蛤,所以导致中间有些代码比较重复。Code#include<bits/stdc++.h>//模拟usingnamespacestd;intn,sum=0,a,b,c,d;booljudge(ints){ inttemp=s; if(temp%7==0) return0; while......
  • 数据结构代码整理_基于邻接表的拓扑排序(C++_DFS_BFS_递归)
    目录Chat图解基于栈实现(dfs)基于队列实现(bfs)基于递归实现(dfs)Chat1.代码所属的类在数据结构代码整理_基于邻接表存储结构的有向图的实现(C++)2.拓扑排序的思想就是不断找入度为0的节点并将其输出并标记,标记后与他相连的节点的入度都会减一,不断进行标记直至所有的节点都被输出为止......