每日一题之数据结构-数组篇

逻辑织雪使
• 阅读 274

栈 Stack

栈是一种具有特定行为的线性数据结构,遵循 后进先出(LIFO) 的原则。也就是说,最后放入栈的元素最先被取出。
栈的特点是 只能在栈顶进行插入(压栈)和删除(弹栈) 操作,其他位置的元素无法直接访问。类比现实生活中的栈,可以将其看作是一摞盘子,最后放入的盘子最先被取出。

括号匹配

  • 一个字符串内部可能包含 { } ( ) [ ] 三种括号,判断该字符串是否是括号匹配的。如 ({})[{()}] 就是匹配的, {a(b{a(b}c) 就是不匹配的。
  • 思路:

    • 遇到做括号 { [ ( 则压入栈
    • 遇到右括号 } ] ) 则判断栈顶, 相同的则出栈
    • 最后判断栈的长度是否为0
/**
 * @param {string} s
 * @return {boolean}
 */
function isValid(s) {
  const stack = [];
  const bracketMap = new Map([
    ["}", "{"],
    ["]", "["],
    [")", "("],
  ]);
  if (s.length % 2 !== 0) {
    return false;
  }

  for (let char of s) {
    // 判断Map中是否存在 {, (, [, 首先遇到开括号肯定不存在, 所以走else, 将开括号压入栈, 遇到闭括号进入if判断
    if (bracketMap.has(char)) {
      const top = stack.pop();
      if (top !== bracketMap.get(char)) {
        return false;
      }
    } else {
      stack.push(char);
    }
  }
  return stack.length === 0;
}

最小栈

  • 思路:

    • 我们需要维护一个辅助栈作为取最小栈的数组 min_stack
    • 当一个元素要入栈, 我们取辅助栈的栈顶存储的最小值和需要入栈的元素做对比,取出最小值, 将最小值压入辅助栈, 这样辅助栈栈顶绝对是最小值
    • 当一个元素要出栈, 除了需要对栈操作还需要对辅助栈弹出最小值
var MinStack = function () {
  this.x_stack = [];
  this.min_stack = [Infinity];
};

MinStack.prototype.push = function (x) {
  this.x_stack.push(x);
  this.min_stack.push(Math.min(this.min_stack[this.min_stack.length - 1], x));
};
MinStack.prototype.pop = function () {
  this.x_stack.pop();
  this.min_stack.pop();
};
MinStack.prototype.top = function () {
  return this.x_stack[this.x_stack.length - 1];
};
MinStack.prototype.getMin = function () {
  return this.min_stack[this.min_stack.length - 1];
};

删除有序数组中的重复项

  • 思路:

    • 使用双指针
    • 让快指针走在最前面, 如果快指针的前一位和后一位不相等, 则慢指针当前的位置等于快指针位置的值, 同时慢指针往前移一位
/**
 * 删除排序数组中的重复项
 *  双指针
 * @param {number[]} nums
 * @returns {number}
 * @description 给定一个数组[1, 2, 3, 4, 4, 5], 剔除重复的, 返回数组的长度, 数组是升序
 */
var removeDuplicates = function (nums) {
  const n = nums.length;
  if (n === 0) {
    return 0;
  }
  let fast = 1, slow = 1;
  while(fast < n) {
    // 判断前一位和后一位不相等
    if (nums[fast] !== nums[fast - 1]) {
      nums[slow] = nums[fast];
      ++slow;
    }
    ++fast;
  }
  return slow;
};
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
stack顺序存储结构
《偶刚开始学习数据结构,欢迎拍砖111》栈是只能通过访问它的一段来实现数据存储的一种线性数据结构,换句话来说就是先进后出的原则,FILO,与队列刚好相反哈,现在只说stack。栈包括以下几种基本运算(1)初始化(2)判断是否为空(3)push(4)pop(5)top其他的则根据这几种基本操作进行组合,即可实现。栈的实现同样
似梦清欢 似梦清欢
2年前
栈和队列
栈原理栈(stack)又名堆栈,是一种只能在表尾进行插入和删除操作的线性表。能够进行操作的这一端被称为栈顶,相对地,把另一端称为栈底。:::warning栈内元素操作时先进后出,类似于电梯上下成员,最后进去的人最先出
Wesley13 Wesley13
3年前
java(十一)数组
数组用来存放相同数据类型的数据,逻辑位置与物理位置都是连续的。数组存放在堆里。栈和堆:栈:方法调用的时候使用栈,局部变量存放在栈里。堆:动态的分配内存,new出来的。引用类型存放在堆里,在栈里存放引用,也就是地址,一般用16进制来表示地址:0x...。基本类型和引用类型的区别:基本类型:在栈中存放的是二进制位。引用
九路 九路
4年前
5 手写Java Stack 核心源码
Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。只能在一端进行插入或者删除,即压栈与出栈栈的实现比较简单,性质也简单。可以用一个数组来实现栈结构。1.入栈的时候,只在数组尾部插入2.出栈的时候,只在数组尾部删除我们来看一下Stack的用法:如下publicstaticvoidmai
Wesley13 Wesley13
3年前
Java实现顺序栈
一、分析  栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。  顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。  一个标准的顺序栈
Wesley13 Wesley13
3年前
C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数
在定义可变参数的函数之前,先来理解一下函数参数的传递原理:1、函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈。2、参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在执行函数的时候,从最后一个(最右边)参数开始入栈。因此栈底高地址,栈顶低地址,举个例子说明一下:voidtest(inta,floatb,ch
Stella981 Stella981
3年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
Wesley13 Wesley13
3年前
C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件include<stackinclude<queue定义栈如下:stack<intstk;定义队列如下:queue<intq;栈提供了如下的操作s.empty()如果栈为空返回true,否则返回fals
Wesley13 Wesley13
3年前
20165322 第一周结队编程
结队编程四则运算阶段总结学习笔记中缀表达式转换为后缀表达式如果遇到数字,我们就直接将其输出。如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。如果遇到一个右括号,持续出栈并输出符号
Wesley13 Wesley13
3年前
Java内存管理
一、Java内存分类1、Java有几种存储区域?\寄存器\在CPU内部,开发人员不能通过代码来控制寄存器的分配,由编译器来管理\栈\在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域,即栈顶的地址和栈的最大容量是系统预先规定好的。\优点:由系统自动分配,速度较快。
菜园前端 菜园前端
2年前
什么是栈?
原文链接:栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底。操作栈的元素时,只能从栈顶操作(添加、移除、取值)。实现功能在JavaScript中没有栈,但是可以通过Array实现栈的所有功能push()入栈po