栈和队列的常见面试题

1、两个队列实现一个栈
两个队列实现一个栈

2、两个栈实现一个队列
【算法思想】
1>设计类
成员变量:给两个栈s1和s2来模拟实现一个队列
成员函数:入队Push()和出队Pop()
2>给两个指向栈对象s1、s2的指针input和output,分别用来入队和出队
3>按照先进先出的方式模拟入队和出队操作
Push:将input指向不空的栈,然后在input中入队
Pop:将input所指栈中的前n-1(n为栈中元素个数)的数据先转移到output所指的栈中,同时pop掉input中的前n-1个元素,最后pop掉input中的最后一个元素,即可实现先进先出。

【代码实现】

/*用两个栈实现一个队列*/
#pragma once
#include <iostream>
#include <stack>
using namespace std;

template <class T>
class Queue
{
public:
    void Push(T data)//入队
    {
        stack<T>* input = NULL;//入队指针
        if (!s1.empty())//如果s1不为空,入队指针就指向s1
            input = &s1;
        else           //如果s1为空,入队指针就指向s2
            input = &s2;
        input->push(data);//在入队指针所指的栈中push数据
    }
    void Pop()//出队
    {
        if (s1.empty() && s2.empty())//如果两个栈都为空,说明队列是空的,直接返回
        {
            cout<<"queue empty!"<<endl;
            return;
        }
        stack<T>* input,*output;//定义入队指针和出队指针
        if (s1.empty())//如果s1为空,就将入队指针指向s2,出队指针指向s1
        {
            input = &s2;
            output = &s1;
        } 
        else          //如果s1不为空,就将入队指针指向s1,出队指针指向s2
        {
            input = &s1;
            output = &s2;
        }
        size_t size = input->size();//用临时变量size保存队列中的元素个数
        for (size_t i = 0; i < size - 1; ++i)//将入队指针所指栈的前(size-1)个元素转入出队栈
        {
            output->push(input->top());
            input->pop();//同时将转移过的数据删除
        }
        input->pop();//将最先进入队列的数据出队
        swap(input,output);//交换入队和出队指针
    }
protected:
    stack<T> s1;
    stack<T> s2;
};


void TestQueue()
{
    Queue<int> q;
    q.Push(1);
    q.Push(4);
    q.Push(3);
    q.Push(5);

    q.Pop();
    q.Pop();
    q.
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值