若进栈序列为 1,2,3,4 ,进栈过程当中能够出栈,则下列不可能的一个出栈序列是(C) A 1,4,3,2 B 2,3,4,1 C 3,1,4,2 D 3,4,2,1
该题主要是考察栈的特性,栈是后进先出的一种数据结构,只要记住该特性就能够,题目说了在入栈的过程当中,能够出栈,所以该题目最近但的方式就是用每一个选项来模拟入栈和出栈过程就能够,好比:html
A: 1 4 3 2–> 1 入栈,而后出栈;2 3 4依次入栈,而后再一次出栈,能够获得该序列,说明A选项正确,后面选项以此类推。java
1.表达式 a*(b+c)-d 的后缀表达式是:(B) A、abcd*+- B、abc+*d- C、abc*+d- D、-+*abcd 2.表达式 a+b*c-(d+e)/f 的后缀表达式为( abc*+de+f/ -)。
该题是栈经典的应用。好比:{[]}
就是匹配的面试
class Solution { public boolean isValid(String s) { Stack<Character> 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()) { System.out.println("右括号多!"); return false; } //先拿到栈顶元素的括号 char ch2 = stack.peek(); if(ch2 == '(' && ch == ')' || ch2 == '[' && ch == ']' || ch2 == '{' && ch == '}') { stack.pop(); }else { System.out.println("左右括号不匹配"); return false; } } } if (!stack.empty()) { System.out.println("左括号多!"); return false; } return true; } }
OJ连接:https://leetcode-cn.com/problems/implement-queue-using-stacks/数据结构
队列的特性:先进先出 栈的特性:后进先出ide
本解法主要是使用两个栈来模拟实现队列的特性,一个栈用来模拟入队列,一个栈用来模拟出队列svg
入队列this
假设栈1模拟入队列,即每次入队列时都将元素插入到栈1中阿里云
出队列spa
用栈2模拟出队列,若是栈2中没有数据时,将栈1中全部的数据导入到栈2再出栈,由于栈是后进先出,将栈1中数据导入到栈2后,先队列的元素恰好在栈2的栈顶,就能够先出了
获取队头元素
直接获取栈2的栈顶元素,当栈2没有元素时,将栈1中元素移动到栈2中,再取栈顶元素,可是该操做与出队列有点重复,所以:先出队列,而后保存元素做为返回值,再将该元素入队列便可
判空
若是队列底层的两个栈都是空的,则队列为空
class MyQueue { private Stack<Integer> stack1; private Stack<Integer> stack2; /** Initialize your data structure here. */ public MyQueue() { this.stack1 = new Stack<>(); this.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(empty()) { return -1; } if(stack2.empty()) { //导入第一个栈的元素 while (!stack1.empty()) { stack2.push(stack1.pop()); } } return stack2.pop(); } /** Get the front element. */ public int peek() { if(empty()) { return -1; } if(stack2.empty()) { //导入第一个栈的元素 while (!stack1.empty()) { stack2.push(stack1.pop()); } } //stack2.empty() return stack2.peek(); } /** Returns whether the queue is empty. */ public boolean empty() { if(stack1.empty() && stack2.empty()) { return true; } return false; } }
本方法采用两个栈来模拟实现:minStack 栈主要用来保存最小值,stack 栈主要用来保存入栈的数据
入栈
入栈时每次都将元素向stack 数据栈中放一个,注意该元素入栈后可能会是栈中的最小值,所以可能须要更新最小栈,当minStack 栈为空,或者入栈元素小于等于当前栈中最小值(即minStack 的栈顶元素)时,将该元素在minStack 栈中也放置一份
出栈:
当stack 和minStack 栈顶元素相等时候,minStack 栈要出一个元素
stack 每次出栈都要出一个元素
获取栈顶元素
取stack 数据栈栈顶便可
获取栈中的最小值
获取minStack 栈顶元素便可
class MinStack { private Stack<Integer> stack; private Stack<Integer> minStack; /** initialize your data structure here. */ public MinStack() { this.stack = new Stack<>(); this.minStack = new Stack<>(); } public void push(int x) { stack.push(x); if(minStack.empty()) { //最小栈内没有元素 minStack.push(x); }else { //最小栈内有元素 拿到栈顶元素 和 x比较 int top = minStack.peek();// -2 if(x <= top) { minStack.push(x); } } } public void pop() { if(!stack.empty()) { int tmp = stack.pop(); if(tmp == minStack.peek()) { minStack.pop(); } } } public int top() { if(stack.empty()) { return -1; } return stack.peek(); } public int getMin() { if(minStack.empty()) { return -1; } return minStack.peek(); } }
若是你看了之后不是很明白,你能够点击看下面的视频讲解:
鼠标点击这里
或者观看:
数据结构高频面试题之栈和队列(JAVA实现)
若是视频中遇到问题,请咨询:1092687209(QQ群)
下一篇:http://www.javashuo.com/article/p-klqcjtxn-mq.html
文章还不错,请点赞 想看什么内容,请留言 持续更新有价值的内容~~