栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用两个栈实现队列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用两个栈实现队列

题目链接

思路

维护两个栈stackIn和stackOut;stackIn支持插入操作,stackOut支持删除操作
根据栈先进后出的特性,我们每次往stackIn里插入元素时,stackIn的底部元素就是最后插入的元素;顶部就是下一次待删除的元素.
再执行删除操作时,我们先检查一下stackOut和stackIn是否全部为空.如果为空我们就return -1;如果不为空单独判断stackOut是否为空,不为空直接弹出元素即可;如果为空我们将stackIn里面的元素一个个弹出插入到stackOut里面,这样stackOut元素就是待删除元素的顺序(相当于duistackIn做了一次反转);删除的时候直接弹出stackOut的元素便可

java
class CQueue {
    Stack stackIn;
    Stack stackOut;

    public CQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }

    public void appendTail(int value) {
        stackIn.push(value);
    }

    public int deleteHead() {
        if (stackIn.isEmpty() && stackOut.isEmpty()) {
            return -1;
        }
        if (!stackOut.isEmpty()) {
            return stackOut.pop();
        }
        while (!stackIn.isEmpty()) {
            stackOut.push(stackIn.pop());
        }
        return stackOut.pop();
    }
}
go
type CQueue struct {
	stackIn, stackOut *list.List
}

func Constructor() CQueue {
	return CQueue{
		stackIn:  list.New(),
		stackOut: list.New(),
	}
}

func (this *CQueue) AppendTail(value int) {
	this.stackIn.PushBack(value)
}

func (this *CQueue) DeleteHead() int {
	if this.stackOut.Len() == 0 && this.stackIn.Len() == 0 {
		return -1
	}
	if this.stackOut.Len() == 0 {
		for this.stackIn.Len() > 0 {
			this.stackOut.PushBack(this.stackIn.Remove(this.stackIn.Back()))
		}
	}
	res := this.stackOut.Back()
	this.stackOut.Remove(res)
	return res.Value.(int)
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/763584.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号