栈、队列算法题

  • 用栈实现队列,完成队列的Push和Pop操作。 队列中的元素为int类型

//思路

栈只能从栈顶出入,队列从队首出,队尾入,借助两个栈:栈1的顶为队尾,栈2的顶为队首
push 从队尾压入一个元素,从s1压入,栈空和非空情况一样,无返回值
pop 从队首一个弹出元素,s2不空时队首在s2栈顶,s2空时队首在s1栈底,需要先把s1中所有元素依次弹入s2,然后弹出s2栈顶
注意从A中弹出所有元素压入B时,因为A数组改变,所以需要先把数组长度存下来,再使用保存的值控制for循环
如果s1空,队列为空,pop弹出null

var stack1 = [],
  // var stack1 = [],
  stack2 = []; //定义两个栈
//入队,修改原数组,无返回值
function push(node) {
  // write code here
  stack1.push(node); //压入栈1
}
//出队,修改原数组,返回出队元素
function pop() {
  // write code here
  //栈2不空,返回栈2栈顶元素
  if (stack2.length !== 0) return stack2.pop();
  //栈2空,返回栈1栈底元素
  if (stack2.length === 0) {
    //栈1空,返回空
    if (stack1.length === 0) return null;
    //栈1不空,将栈1元素全部放入栈2,然后返回栈顶元素
    let len =stack1.length;//for循环修改了stack1数组,所以要先保存len作为循环的计数器
    for (let i = 0; i < len; i++) {
      stack2.push(stack1.pop());
    }
    return stack2.pop();
  }
}
  • 用队列实现栈

//队列:先进先出。简单来说,就是有一个数组,通过 push() 推进每个元素,通过 shift() 推出第一个元素,这种形式就是队列。
//栈:先进后出。简单来说,就是有一个数组,通过 push() 推进每个元素,通过 pop() 推出最后一个元素,这种形式就是栈。
如果小伙伴们还是不理解,那么我们讲讲两个例子:

队列:饭堂打饭。我们需要排队,先到的排前面,打完饭后可以先走。
栈;俄罗斯套娃,或者叠罗汉。先进的需要最后出,要不然取不出来,或者罗汉直接倒了。
最后,根据这个思路,我们可以轻易求解。

var MyStack = function() {
  this.stask = [];
};

MyStack.prototype.push = function(x) {
  this.stask[this.stask.length] = x;
};

MyStack.prototype.pop = function() {
  let arr = this.stask;
  let last = this.stask.length - 1;
  let temp = arr[last];
  this.stask.length = this.stask.length - 1;
  return temp;
};

MyStack.prototype.top = function() {
  let arr = this.stask;
  let last = this.stask.length - 1;
  return arr[last];
};

MyStack.prototype.empty = function() {
  let arr = this.stask;
  if (!arr.length) {
    return true;
  } else {
    return false;
  }
};
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数、pop()、push(),时间复杂度应为O(1)

//思路

时间复杂度应为O(1)所以应该保存每次栈压入元素之后的最小值,新建一个stkMin,和stk同步
push——栈元素是第一个,入栈元素是当前最小值时,stkMin压入node,否则压入stkMin栈顶元素(之前的最小值依然是最小值)
pop——stkMin和stk同步出栈
min——返回stkMin栈顶元素

var stk = [];
var stkMin = [];
function push(node) {
  // write code here
  stk.push(node);
  stkMin.length === 0 || node < stkMin[stkMin.length - 1]  ? stkMin.push(node) //stkMin空/node小于栈顶元素时,node为最小值  : stkMin.push(stkMin[stkMin.length - 1]); //node大于栈顶元素时,栈顶元素为最小值
}
function pop() {
  // write code here
  if (stk.length === 0) return null;
  stkMin.pop();
  return stk.pop();
}
 function top() {
   // write code here
   return stk[stk.length - 1]; //返回栈顶元素
 }
function min() {
  // write code here
  return stkMin[stkMin.length - 1];
}
  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。

//思路

判断一个序列是不是栈的弹出序列,其实是判断将序列1压入栈时,栈顶元素是否可以形成序列2,栈顶元素有三种可能:
1.当前栈顶
2.弹出栈顶之后的新栈顶
3.继续压入新的栈顶
比较顺序:1,2,3,可以最多的弹出所有元素
借助一个辅助栈,依次把所有元素压入这个栈里,设置一个指针idx指向需要弹出的元素,初始指向弹出序列的第一个元素
每次压入之后,都比较idx元素和栈顶元素是否相等,如果相等,就弹出这个值,idx指向下一个,循环比较所有相等值全部弹出,直到两个值不等,不再弹出序列,继续压入
数组里所有元素都压栈完成以后,如果辅助栈还有没弹出的元素,就代表
不是弹出序列,如果栈空了,就代表是弹出序列。

function IsPopOrder(pushV, popV) {
  // write code here
  //任意空数组/数组长度不相等,不满足条件
  if (pushV.length === 0 || popV.length === 0 || popV.length !== pushV.length)
    return false;
  //单个数组,比较一个元素
  if (pushV.length === 1 && popV.length === 1) return pushV[0] === popV[0];
  let stk = []; //辅助栈
  let idx = 0; //指针,指向popV的第一个元素
  //将pushV压入辅助栈
  for (let i = 0; i < pushV.length; i++) {
    stk.push(pushV[i]);
    // stk空或者栈顶元素和popV指针的元素不相等,跳过循环,继续入栈
    // 栈顶元素和popV指针的元素相等时,循环比较栈顶元素和pop中指针指向的元素
    while (stk.length != 0 && stk[stk.length - 1] === popV[idx]) {
      stk.pop(); // 栈顶元素出栈
      idx++; //指针下移,继续比较
    }
  }
  return stk.length === 0; //所有popV中的元素都按顺序出栈,则是一个弹出序列
}
IsPopOrder([1, 2, 3, 4, 5], [4, 5, 3, 2, 1]);
IsPopOrder([1], [2]);

原文地址:https://www.cnblogs.com/huahongcui/p/11519622.html

时间: 2025-01-01 16:27:44

栈、队列算法题的相关文章

【常用算法思路分析系列】栈和队列高频题集(修改版)

本文是[常用算法思路分析系列]的第三篇,分析栈和队列相关的高频题目.本文分析:1.可查询最值的栈:2.用两个栈实现队列的功能:3.反转栈中元素:4.排序栈中元素:5.滑动窗口问题. 本系列前两篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析系列]字符串高频题集 1.可查询最值的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路: 定义两个栈stackData和stackMin,其中stackData用来存放进栈的数据,stackMin用来存放进栈过

经典算法题每日演练——第十九题 双端队列

原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in love,嗨,慢慢调整心态吧, 这篇就选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在 队列两端进行

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

笔试算法题(50):简介 - 广度优先 &amp; 深度优先 &amp; 最小生成树算法

广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能非递归实现: 相比DFS较快,空间换时间: 适合广度大的图: 空间复杂度:邻接矩阵O(N^2):邻接表O(N+E): 时间复杂度:O(V+E): DFS优缺点: 无论是系统栈还是用户栈保存的节点数都只是树的深度,所以空间耗用小: 有递归和非递归实现: 由于有大量栈操作(特别是递归实现时候的系统调用),执行速度

算法题库

1. 时针分针重合几次 表面上有60个小格,每小格代表一分钟, 时针每分钟走1/12小格,分针每分钟走1小格,从第一次重合到第二次重合分针比时针多走一圈即60小格,所以 60/(1-1/12)=720/11 每隔720/11分才重合一次(而并不是每小时重合一次) 1440里有22个720/11,如果说算上0点和24点,那也是重合23次而已,但我觉得0点应该算到前一天的24点头上,所以每一天循环下来重合22次啊 2. 找出字符串的最长不重复子串,输出长度 建一个256个单元的数组,每一个单元代表一

笔试算法题

转自:http://www.cnblogs.com/xwdreamer/archive/2011/12/13/2296910.html 1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.   10  / \  6  14 / \ / \4  8 12 16 转换成双向链表4=6=8=10=12=14=16.  首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{  i

LeetCode算法题-Min Stack(Java实现)

这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈. push(x) - 将元素x推入堆栈. pop() - 删除堆栈顶部的元素. top() - 获取顶部元素. getMin() - 检索堆栈中的最小元素. 例如: MinStack minStack = new MinStack(); minStack.push(-2); minSta

LeetCode算法题-Find Mode in Binary Search Tree(Java实现)

这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的所有模式(最常出现的元素).假设BST定义如下: 节点的左子树仅包含键小于或等于节点键的节点. 节点的右子树仅包含键大于或等于节点键的节点. 左右子树也必须是二叉搜索树. 例如: 鉴于BST [1,null,2,2], 1 2 / 2 返回[2]. 注意:如果树有多个模式,您可以按任何顺序返回它们.

LeetCode算法题-Convert BST to Greater Tree(Java实现)

这是悦乐书的第255次更新,第268篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第122题(顺位题号是538).给定二进制搜索树(BST),将其转换为更大树,使原始BST的每个键都更改为原始键加上所有键的总和大于BST中的原始键.例如: 输入:二进制搜索树的根,如下所示: 5 / 2 13 输出:大树的根,如下所示: 18 / 20 13 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 0