[C++数据结构]:用队列实现栈、以及用栈创建队列

 [C++数据结构]:用栈创建队列、以及用队列实现栈

一、栈与队列的基础知识

1.栈(Stack):

2.队列(Queue): 

3.二者的遍历规则

4.常见的STL接口

 二、用栈创建队列

三、用队创建栈

大功告成!编写不易,大家成功后点个关注or赞谢谢~~


一、栈与队列的基础知识

手绘栈与队列的区别:

1.栈(Stack):

[C++数据结构]:用队列实现栈、以及用栈创建队列_第1张图片

2.队列(Queue): 

 

[C++数据结构]:用队列实现栈、以及用栈创建队列_第2张图片

3.二者的遍历规则

栈:只有顶端元素可以访问,不允许挨个遍历

队列:只有队头和队尾可以访问和使用,不允许挨个遍历

4.常见的STL接口

栈:

stack<数据类型> name;    //构造

push(值);  //栈底添加

pop();    //出栈

top();    //返回栈顶元素

empty();  //判断栈是否为空

size();   //返回栈的大小

队列:

queue<类型> name;   //构造

push(值)    //队尾插入

pop()      //从队头移除一个元素

back()    //返回最后队尾第一个值

front()   //返回第一个值
    
empty()   //判断队列是否为空

size()    //返回队列大小

 二、用栈创建队列

推荐以力扣上的232题为基础学习:232. 用栈实现队列

模拟入队出队的过程:

class MyQueue {
public:

    stack queue_push;  //定义入栈相当于入队的操作
    stack queue_back;  //定义出栈相当于出队的操作

    MyQueue() 
    {

    }
    
    void push(int x) 
    {
        queue_push.push(x);
    }
    
    int pop() 
    {
        if(queue_back.empty())  //如果为空则说明出队没有
        {
            while(!queue_push.empty())  //把入队中的所有数全部放入出队中
            {
                queue_back.push(queue_push.top()); //这个地方不能直接将pop()赋值传入,会报错
                queue_push.pop();
            }
        }
            int mid_num = queue_back.top();
            queue_back.pop();
            return mid_num;
    }
    
    int peek() 
    {
        int pop_num = this->pop();  //复用pop()中返回队头的第一个元素
        queue_back.push(pop_num);  //因为该功能只是返回但是不移除,因此还要放进去
        return pop_num;
    }
    
    bool empty() 
    {
        return (queue_back.empty() && queue_push.empty());
    }
};

 注:在peek函数中,并没有重新定义,而是使用了之前的pop函数,第一如果重新写的话,提交会报错。第二这样可以提升代码的复用性。

三、用队创建栈

推荐以力扣上的225题为基础学习:225. 用队列实现栈

模拟入栈出栈的过程: 用一个队列就能够实现

class MyStack {
public:

    queue queue_stack;

    MyStack() 
    {

    }
    
    void push(int x) 
    {
        queue_stack.push(x);
    }
    
    int pop() 
    {
        int peak = queue_stack.back();
        while(queue_stack.front() != peak)
        {
            queue_stack.push(queue_stack.front());
            queue_stack.pop();
        }
        int front_num = queue_stack.front();
        queue_stack.pop();
        return front_num;
    }
    
    int top() 
    {
        return queue_stack.back();
    }
    
    bool empty() 
    {
        return queue_stack.empty(); 
    }
};

 自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!

大功告成!编写不易,大家成功后点个关注or赞谢谢~~


你可能感兴趣的:(C++,1024程序员节,c++,数据结构,算法)