栈、队列、堆相关力扣算法题

13 篇文章 0 订阅
本文介绍了如何使用两个队列来实现栈的后入先出(LIFO)操作,以及如何用两个栈实现先入先出(FIFO)的队列。此外,还展示了如何设计一个最小栈,能在常数时间内获取栈中的最小元素。最后,探讨了一个算法问题,即判断给定的出栈序列是否合法。这些实现展示了数据结构的灵活性和在解决实际问题中的应用。
摘要由CSDN通过智能技术生成

一、 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
思路:使用两个队列,保证后添加的元素在队前。先把x添加到临时队列中,如果queue不为空,将queue中的数组push到临时队列中。如果临时队列不为空,就把临时队列中的数据push到queue中,这样循环,就可以保证后来的元素在队伍前面。
var MyStack = function() {
    this.queue = [];
    this.temp_queue = [];
};

/** 
 * @param {number} x
 * @return {void}
 */
MyStack.prototype.push = function(x) {
    this.temp_queue.push(x);
    while(this.queue.length!==0){
        this.temp_queue.push(this.queue.shift());
    }
    while(this.temp_queue.length!==0){
        this.queue.push(this.temp_queue.shift())
    }
};

/**
 * @return {number}
 */
MyStack.prototype.pop = function() {
    if(this.queue.length!==0){
       return this.queue.shift();
    }
};

/**
 * @return {number}
 */
MyStack.prototype.top = function() {
    if(this.queue.length!==0){
       return this.queue[0];
    }
};

/**
 * @return {boolean}
 */
MyStack.prototype.empty = function() {
    return this.queue.length == 0;
};

二、用栈实现队列

请你仅使用**两个栈**实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

思路:利用临时栈保证先来的在前面即可

var MyQueue = function() {
    this.stack = [];
    this.temp_stack = []
};

/** 
 * @param {number} x
 * @return {void}
 */
MyQueue.prototype.push = function(x) {
    while(this.stack.length!==0){
        this.temp_stack.push(this.stack.shift())
    }
    this.temp_stack.push(x);
    while(this.temp_stack.length!==0){
        this.stack.push(this.temp_stack.shift());
    }       
};

/**
 * @return {number}
 */
MyQueue.prototype.pop = function() {
   if(this.stack.length!==0){
        return this.stack.shift();
   }
};

/**
 * @return {number}
 */
MyQueue.prototype.peek = function() {
    if(this.stack.length!==0){
        return this.stack[0];
   }
};

/**
 * @return {boolean}
 */
MyQueue.prototype.empty = function() {
    return this.stack.length == 0;
};

三、 最小栈155

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

思路: 借用一个辅助min栈保存最小值,每当push一个val时,判断val的值和minStack[this.minStack.length - 1]谁大谁小,谁小把谁push到辅助栈minStack中(注意别忘了等于的情况!!)。pop的时候,把stack和辅助栈中的顶部元素都pop出来。

var MinStack = function() {
    this.stack = [];
    this.minStack = []
};

/** 
 * @param {number} val
 * @return {void}
 */
MinStack.prototype.push = function(val) {
    this.stack.push(val);
    if(this.minStack.length === 0){
        return this.minStack.push(val)
    }
    if(val <= this.minStack[this.minStack.length - 1]){
        return this.minStack.push(val);
    }else if(val > this.minStack[this.minStack.length - 1]){
        return this.minStack.push(this.minStack[this.minStack.length - 1])
    }
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
    if(this.stack.length!==0&&this.minStack.length!==0){
        this.minStack.pop()
        return this.stack.pop()
    }
};

/**
 * @return {number}
 */
MinStack.prototype.top = function() {
    if(this.stack.length!==0){
        return this.stack[this.stack.length - 1]
    }
};

/**
 * @return {number}
 */
MinStack.prototype.getMin = function() {
    return this.minStack[this.minStack.length - 1]
};

/**
 * Your MinStack object will be instantiated and called as such:
 * var obj = new MinStack()
 * obj.push(val)
 * obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.getMin()
 */

四、poj2545判断是否为合法的出栈序列

思路:出栈结果都存储在队列中,按元素顺序,将元素push入栈。每push一个元素,就检查队列头部与栈元素头部的元素是否相等,如果相等就弹出栈顶元素。若最终的栈为空,说明序列合法,否则不合法。

let arr = [5,1,4,2,3];//出栈结果
var check_is_valid_order = function(arr){
	let length = arr.length;
	let stack = [];
	for(i=1;i<=length;i++){
		if(arr[i-1] !== stack[stack.length - 1]){
			stack.push(i);
		}
		while(arr[i-1] === stack[stack.length - 1]){
			stack.pop();
		}
	}
	if(stack.length!==0){
		return false
	}else{
		return true;
	}
}
console.log(check_is_valid_order(arr))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值