[算法学习]两个栈实现一个队列

32 篇文章 0 订阅
29 篇文章 10 订阅

问题描述:
用两个栈实现一个队列,实现两个方法:入队appendTail,出队deleteHead

分析:
第一眼就能想到两个做法,
(1) 入队麻烦出队容易:
声明两个栈,一个是存数据用的栈(dataStack),一个是辅助用的栈(tempStack)。
入队操作时,先将dataStack中的所有元素出栈压入tempStack中,然后将要入队的元素压入tempStack中,再将tempStack所有元素出栈到dataStack,至此入队成功,dataStack栈顶元素就是第一个入队的元素(队头)。
出队操作时,只需将dataStack栈顶元素弹出返回就可以。
(2) 入队容易出队麻烦:
声明两个栈,一个是存数据用的栈(dataStack),一个是辅助用的栈(tempStack)。
入队操作时,只需要将入队元素压入dataStack就可以。
出队操作时,需要将dataStack全部元素出栈到tempStack中,tempStack弹出元素返回,然后再将tempStack剩下元素全部出栈到dataStack。


理一理代码思路

(1). 入队麻烦出队容易

Stack<Integer> dataStack = new Stack<Integer>();
Stack<Integer> tempStack = new Stack<Integer>();

/**
 * 入队
 * @param item
 */
public void appendTail(int item)
{
    while (!dataStack.isEmpty())
    {
        tempStack.push(dataStack.pop());
    }
    tempStack.push(item);
    while (!tempStack.isEmpty())
    {
        dataStack.push(tempStack.pop());
    }
}
/**
 * 出队
 * @return
 * @throws Exception
 */
public int deleteHead()
{
    return dataStack.pop();
}

(2). 入队容易出队麻烦

Stack<Integer> dataStack = new Stack<Integer>();
Stack<Integer> tempStack = new Stack<Integer>();
/**
 * 入队
 * @param item
 */
public void appendTail(int item)
{
    dataStack.push(item);
}

/**
 * 出队
 * @return
 * @throws Exception
 */
public int deleteHead() throws Exception
{
    if(dataStack.isEmpty())
    {
        throw new Exception("队列为空!");
    }
    int head=0;
    while (!dataStack.isEmpty())
    {
        tempStack.push(dataStack.pop());
    }
    head=tempStack.pop();
    while (!tempStack.isEmpty())
    {
        dataStack.push(tempStack.pop());
    }
    return head;
}

优化

思路:每次都要全部出栈全部出栈这样太麻烦,时间复杂度有点大。优化方案就是声明一个入队的栈(enStack)和一个出队的栈(deStack)。
入队时,将入队元素压入enStack中就可以。
出队时,做个判断,如果deStack为空,就将enStack的元素全部出栈压入deStack中,然后将deStack栈顶元素弹出返回即可。
这样,确实优化了。

Stack<Integer> enStack=new Stack<Integer>(); // 用于入队的表
Stack<Integer> deStack=new Stack<Integer>(); // 用于出队的表

public void appendTail(int item)
{
    enStack.push(item);
}

public int deleteHead()
{
    if(deStack.isEmpty())
    {// 当出队的栈为空,那就从入队栈中获取元素更新。
        while(!enStack.isEmpty())
        {
            deStack.push(enStack.pop());
        }
    }
    // 如果deStack为空会抛一个EmptyStackException异常,这我就不处理了。
    return deStack.pop();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值