(1)用两个栈实现队列和(2)用两个队列实现栈

  1. 很经典的一个算法题,既考察了栈的性质,又考察了队列的性质。我们可以定一个stack1,stack2.。入栈的时候直接入到stack1,当出栈的时候,先判断stack2是否为空,为空的话,把stack1顺序出栈压入stack2.然后把stack2栈顶元素弹出。同理取front元素的时候也一样。empty判断直接判断连个栈是否为空,size是两个对战的size相加。代码实现如下:
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    template
    class MyQueue//先进先出
    {
    public:
    bool empty();
    int size();
    void push(T val);
    void pop();
    T front();
    private:
    stack m_stack1;
    stack m_stack2;
    };
    template
    bool MyQueue::empty()
    {
    return this->m_stack1.empty() && this->m_stack2.empty();
    }
    template
    int MyQueue::size()
    {
    return this->m_stack1.size() + this->m_stack2.size();
    }
    template
    void MyQueue::push(T val)
    {
    this->m_stack1.push(val);
    }
    template
    void MyQueue::pop()
    {
    if (!this->m_stack2.empty())
    {
    this->m_stack2.pop();
    }
    else
    {
    while (!this->m_stack1.empty())
    {
    T val = this->m_stack1.top();
    this->m_stack2.push(val);
    this->m_stack1.pop();
    }
    this->m_stack2.pop();
    }
    }
    template
    T MyQueue::front()
    {
    if (!this->m_stack2.empty())
    {
    return this->m_stack2.top();
    }
    else
    {
    while (!this->m_stack1.empty())
    {
    T val = this->m_stack1.top();
    this->m_stack2.push(val);
    this->m_stack1.pop();
    }
    return this->m_stack2.top();
    }
    }
    int main()
    {
    MyQueue *Q = new MyQueue();
    queue herQ;
    srand((unsigned)time(NULL));
    for (int i = 0; i < 10; i++)
    {
    int val = rand() % 100;
    herQ.push(val);
    Q->push(val);
    cout << val << " ";
    }
    cout << endl;
    cout <<"myQ "<size()<<endl;
    cout <<"herQ "<< herQ.size() << endl;
    cout << "myQ: ";
    while (!Q->empty())
    {
    int val = Q->front();
    cout << val << " ";
    Q->pop();
    }
    cout << endl;
    cout << "herQ: ";
    while (!herQ.empty())
    {
    int val = herQ.front();
    cout << val << " ";
    herQ.pop();
    }
    cout << endl;
    system(“pause”);
    return 0;
    }
    我们用了模板类的设计方法,使代码更具有普适性。执行结果如下:
    在这里插入图片描述
    (2)用两个队列实现栈。栈的特点是先进后出。那么我们定义两个q1,q2两个队列,出栈的时候,我们需要知道最后一个元素,那么我们可以把q1一直出队(q2为空),直到它的size为1,那么这个元素就是我们需要的出栈的元素。通过出栈我们可以判断出q1、q2始终有一个队列为空(队列不为空,没法判断那个先那个后)。入栈的操作,q1、q2都为空的时候,我们入队q1,不都为空的时候,我们哪个不为空,入队哪个。实现的代码如下:
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    template
    class MyStack //先进后出
    {
    public:
    bool empty();
    int size();
    T top();
    void push(T val);
    void pop();
    private:
    queue m_queue1;
    queue m_queue2;
    };
    template
    bool MyStack::empty()
    {
    return this->m_queue1.empty() && this->m_queue2.empty();
    }
    template
    int MyStack::size()
    {
    return this->m_queue1.size() + this->m_queue2.size();
    }
    template
    void MyStack::push(T val)
    {
    if (this->m_queue1.empty() && this->m_queue2.empty())//都为空的时候,入队q1。不都为空的时候,哪个不为空,入队哪个
    {
    this->m_queue1.push(val);
    return;
    }
    else if (!this->m_queue2.empty())
    {
    this->m_queue2.push(val);
    return;
    }
    else if(!this->m_queue1.empty())
    {
    this->m_queue1.push(val);
    return;
    }

}
template
void MyStack::pop()
{
if (this->m_queue2.empty())
{
while (this->m_queue1.size() != 1)//直到size为1,然后这个出队,q1为空
{
T val = this->m_queue1.front();
this->m_queue2.push(val);
this->m_queue1.pop();
}
this->m_queue1.pop();
}
if(this->m_queue1.empty())//直到size为1,然后这个出队,q2为空
{
while (this->m_queue2.size() != 1)
{
T val = this->m_queue2.front();
this->m_queue1.push(val);
this->m_queue2.pop();
}
this->m_queue2.pop();
}
}
template
T MyStack::top()
{
if (this->m_queue2.empty())
{
while (this->m_queue1.size() != 1)//直到size为1,然后这个出队,q1为空
{
T val = this->m_queue1.front();
this->m_queue2.push(val);
this->m_queue1.pop();
}
T val = this->m_queue1.front();
this->m_queue2.push(val);
this->m_queue1.pop();//保留需要展示的队首元素并返回,同时该元素要入队q2,出队q1,保证始终有一个队列为空。下同。
return val;
}
if (this->m_queue1.empty())
{
while (this->m_queue2.size() != 1)
{
T val = this->m_queue2.front();
this->m_queue1.push(val);
this->m_queue2.pop();
}
T val = this->m_queue2.front();
this->m_queue1.push(val);
this->m_queue2.pop();
return val;
}
}
int main()
{
MyStack *myStack = new MyStack();
stack herStack;
srand((unsigned)time(NULL));
for (int i = 0; i < 15; i++)
{
int val = rand() % 100;
herStack.push(val);
myStack->push(val);
cout << val << " ";
}
cout << endl;
cout << "herStack " << herStack.size() << endl;
cout << "myStack: " << myStack->size() << endl;
cout << "herStack: ";
while (!herStack.empty())
{
int val = herStack.top();
cout << val << " ";
herStack.pop();
}
cout << endl;
cout << "myStack: ";
while (!myStack->empty())
{
int val = myStack->top();
cout << val << " ";
myStack->pop();
}
cout << endl;
system(“pause”);
return 0;
}
执行的结果如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值