用栈实现队列

题目描述

使用栈实现队列的下列操作:

  • push(x) – 将一个元素放入队列的尾部。
  • pop() – 从队列首部移除元素。
  • peek() – 返回队列首部的元素。
  • empty() – 返回队列是否为空。

题解

  • 栈的特点是先进后出,队列的特点是先进先出;
  • 定义两个栈,数据栈和辅助栈
  • 每次push时将新来的元素压入数据栈中
  • 每次pop时,首先判断辅助栈中是否为空,
    • 若辅助栈不空则直接弹出辅助栈栈顶元素
    • 若辅助栈为空,则将数据栈中的元素依次全部压入辅助栈中,然后弹出辅助栈栈顶元素

算法

public class MyQueue {
	private Stack<Integer> stack;
	 /** Initialize your data structure here. */
    public MyQueue() {
        stack=new Stack<>();
    }
    /** Push element x to the back of queue. */
    public void push(int x) {
    	Stack<Integer> tempS=new Stack<>();
        while(!stack.isEmpty()) {
        	tempS.push(stack.pop());
        }
        tempS.push(x);//确保新加入的元素在栈的最顶端
        while(!tempS.isEmpty()) {  	
        	stack.push(tempS.pop());
        }
    }
    
    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
    	int x=-1;
        if(empty()==false) {
        	x=stack.pop();
        }
        return x;
    }
    
    /** Get the front element. */
    public int peek() {
        int x=-1;
        if(empty()==false) {
        	x=stack.peek();
        }
        return x;
    }
    
    /** Returns whether the queue is empty. */
    public boolean empty() {
        if(stack.isEmpty())
        	return true;
        else
        	return false;
    }
   }
【SCI复现】基于纳什博弈的多微网主体电热双层共享策略研究(Matlab代码实现)内容概要:本文围绕“基于纳什博弈的多微网主体电热双层共享策略研究”展开,结合Matlab代码实现,复现了SCI级别的科研成果。研究聚焦于多个微网主体之间的能源共享问题,引入纳什博弈理论构建双层优化模型,上层为各微网间的非合作博弈策略,下层为各微网内部电热联合优化调度,实现能源高效利用与经济性目标的平衡。文中详细阐述了模型构建、博弈均衡求解、约束处理及算法实现过程,并通过Matlab编程进行仿真验证,展示了多微网在电热耦合条件下的运行特性和共享效益。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识的研究生、科研人员及从事能源互联网、微电网优化等相关领域的工程师。; 使用场景及目标:① 学习如何将纳什博弈应用于多主体能源系统优化;② 掌握双层优化模型的建模与求解方法;③ 复现SCI论文中的仿真案例,提升科研实践能力;④ 为微电网集群协同调度、能源共享机制设计提供技术参考。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注博弈均衡的求解过程与双层结构的迭代逻辑,同时可尝试修改参数或扩展模型以适应不同应用场景,深化对多主体协同优化机制的理解。
### 用队列实现 要使用队列实现,可以采用一个或两个队列的方式。其中,使用一个队列实现的思路是:每次入操作时,将元素添加到队列的末尾,并保持队列的先进先出特性。为了实现的后进先出特性,每次出时,需要将队列中除最后一个元素外的其他元素依次出队并重新入队,使最后一个元素位于队列的前端。具体操作如下: - **入操作**:直接将元素入队即可。 - **出操作**:将队列中除最后一个元素外的所有元素出队并重新入队,然后将最后一个元素出队。 - **获取顶元素**:与出操作类似,但只需获取最后一个元素的值而不将其移除队列。 - **判空操作**:检查队列是否为空。 通过这种方式,可以确保的后进先出特性被正确实现。 ### 用实现队列 使用两个实现队列的操作更为直观。两个分别命名为 `stack1` 和 `stack2`,其中 `stack1` 用于入队操作,`stack2` 用于出队操作。具体实现如下: - **入队操作**:将元素压入 `stack1`。 - **出队操作**:如果 `stack2` 为空,则将 `stack1` 中的所有元素依次弹出并压入 `stack2`,然后从 `stack2` 弹出顶部元素;如果 `stack2` 不为空,则直接从 `stack2` 弹出顶部元素。 - **获取队列前端元素**:与出队操作类似,但只需获取 `stack2` 的顶部元素(如果 `stack2` 为空,则先将 `stack1` 的元素转移到 `stack2`)。 - **判空操作**:同时检查 `stack1` 和 `stack2` 是否为空。 这种方法能够很好地模拟队列的先进先出特性[^4]。 ### 示例代码 #### 用队列实现(Python) ```python from collections import deque class MyStack: def __init__(self): self.queue = deque() def push(self, x: int) -> None: self.queue.append(x) # 将队列中除新加入元素外的其他元素重新入队 for _ in range(len(self.queue) - 1): self.queue.append(self.queue.popleft()) def pop(self) -> int: return self.queue.popleft() def top(self) -> int: return self.queue[0] def empty(self) -> bool: return len(self.queue) == 0 ``` #### 用实现队列(Python) ```python class MyQueue: def __init__(self): self.stack1 = [] self.stack2 = [] def push(self, x: int) -> None: self.stack1.append(x) def pop(self) -> int: if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop() def peek(self) -> int: if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2[-1] def empty(self) -> bool: return not self.stack1 and not self.stack2 ``` ### 总结 - **用队列实现**:利用队列的先进先出特性,通过调整队列中的元素顺序模拟的后进先出特性。 - **用实现队列**:通过两个的配合,模拟队列的先进先出特性,确保入队和出队操作的时间复杂度尽可能低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值