数据结构之栈应用

  • 一、栈

    • 1.栈的应用
    • 1.1括号匹配
  • 1.2后缀表达式

  • 1.3用栈实现队列

  • 1.4最小栈

  • 1.5栈的压入和弹出序列


一、栈

======================================================================

栈的特性就是先进后出,常用方法是入栈(push()),出栈(pop()),栈空(empty()),看栈顶元素(peek());

1.栈的应用


1.1括号匹配

leetcode 20 题

public boolean isValid(String s) {

//有效括号时隔4个月后重新打卡 看看栈学的怎么样

Stack stack=new Stack<>();

for(int i=0;i<s.length();i++){

char ch=s.charAt(i);

if(ch==‘(’||ch==‘{’||ch==‘[’){

stack.push(ch);

}else{

if(stack.empty()){

//右括号多

return false;

}else{

char ch1=stack.peek();

if(ch1==‘{’&&ch==‘}’||ch1==‘[’&&ch==‘]’||ch1==‘(’&&ch==‘)’){

stack.pop();

}else{

return false;

}

}

}

}

if(!stack.empty()){

return false;

}

return true;

}

1.2后缀表达式

a+b 这是我们最常见的表达式

前缀表达式就是+ab

后缀表达式就是ab+

转换方式就是每一个表达式用括号括起,将两个表达式中间的运算符放到括号外,加括号的顺序就是先乘除后加减

leetcode 150题

逆波兰表达式求值:这里是后缀表达式,所以减法就是后出的减先出的,除法也是。利用栈的特性来实现后缀表达式

public int evalRPN(String[] tokens) {

Stack stack=new Stack<>();

int num1=0;

int num2=0;

for(String str:tokens){

if(str.equals(“+”)){

num1=stack.pop();

num2=stack.pop();

stack.push(num1+num2);

}else if(str.equals(“-”)){

num1=stack.pop();

num2=stack.pop();

stack.push(num2-num1);

}else if(str.equals(“*”)){

num1=stack.pop();

num2=stack.pop();

stack.push(num1*num2);

}else if(str.equals(“/”)){

num1=stack.pop();

num2=stack.pop();

stack.push(num2/num1);

}else{

stack.push(Integer.parseInt(str));

}

}

return stack.pop();

}

1.3用栈实现队列

leetcode 232 题

用栈模拟出队列的push(),pop(),peek(),empty() 方法

class MyQueue {

public Stack stack1;

public Stack stack2;

/** Initialize your data structure here. */

public MyQueue() {

stack1 =new Stack<>();

stack2 =new Stack<>();

}

/** Push element x to the back of queue. */

public void push(int x) {

stack1.push(x);

}

/** Removes the element from in front of queue and returns that element. */

public int pop() {

if(stack2.empty()){

while(!stack1.empty()){

stack2.push(stack1.pop());

}

}

return stack2.pop();

}

/** Get the front element. */

public int peek() {

if(stack2.empty()){

while(!stack1.empty()){

stack2.push(stack1.pop());

}

}

return stack2.peek();

}

/** Returns whether the queue is empty. */

public boolean empty() {

return stack1.empty()&&stack2.empty();

}

}

/**

  • Your MyQueue object will be instantiate
    d and called as such:

  • MyQueue obj = new MyQueue();

  • obj.push(x);

  • int param_2 = obj.pop();

  • int param_3 = obj.peek();

  • boolean param_4 = obj.empty();

*/

1.4最小栈

leetcode 155题

class MinStack {

//定义双栈来实现最小栈

public Deque stack1;

public Deque minStack;

/** initialize your data structure here. */

public MinStack() {

stack1=new LinkedList();

minStack=new LinkedList();

minStack.push(Integer.MAX_VALUE);

}

public void push(int val) {

stack1.push(val);

minStack.push(Math.min(val,minStack.peek()));

}

public void pop() {

stack1.pop();

minStack.pop();

}

public int top() {

return stack1.peek();

}

public int getMin() {

return minStack.peek();

}

}

/**

  • Your MinStack object will be instantiated and called as such:

  • MinStack obj = new MinStack();

  • obj.push(val);

  • obj.pop();

  • int param_3 = obj.top();

  • int param_4 = obj.getMin();

*/

1.5栈的压入和弹出序列

先看题目要求:输入两个整数序列,第一个序列表示栈的压入顺序,第二个序列表示栈的弹出序列,请判断是否为合法的出栈序列

public boolean validateStackSequences(int []pushed,int []popped){

Stack stack=new Stack<>();

int i=0;

for(int num:pushed){

stack.push(num);

while(!stack.isEmpty()&&stack.peek()==popped[i]){

i++;

stack.pop();

}

}

return stack.isEmpty();

}

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

stack.pop();

}

}

return stack.isEmpty();

}

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-5IWQXOud-1719690367719)]

[外链图片转存中…(img-2ChSmKIE-1719690367720)]

[外链图片转存中…(img-J6TOeSLt-1719690367721)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值