栈和队列专项
常见的栈操作
常见的栈操作有push,pop,peek,isEmpty,size等
push为入栈,为栈顶添加新元素。
pop为出栈,删除栈顶元素。
peek为查看栈顶元素。
isEmpty为判断栈是否为空。
size可得到栈的元素个数。
常见的队列操作
add,offer:入队,这两个函数都是入队,区别在于,add入队时发生异常会抛出异常,offer则会返回特殊值。
remove,poll:出队,区别同上。
element,peek:查看队首元素,区别同上
总结
在不考虑多线程的情况下
使用栈就是使用Deque的实现类
使用队列就使用Deque的实现类
使用堆就使用PriorityQueue。
1.232. 用栈实现队列
方法一:用一个队列模拟栈
class MyQueue {
private Stack<Integer> s1,s2;
public MyQueue() {
s1=new Stack<>();
s2=new Stack<>();
}
public void push(int x) {
s1.push(x);
}
public int pop() {
dumpstackIn();
return s2.pop();
}
public int peek() {
dumpstackIn();
return s2.peek();
}
public boolean empty() {
return s1.isEmpty()&&s2.isEmpty();
}
public void dumpstackIn(){
if(s2.isEmpty()){
while(!s1.isEmpty()){
s2.push(s1.pop());
}
}
}
}
方法二:用两个队列模拟栈
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
public MyStack() {
q1=new LinkedList<>();
q2=new LinkedList<>();
}
public void push(int x) {
q2.offer(x);
while(!q1.isEmpty()){
q2.offer(q1.poll());
}
Queue<Integer> temp=q1;
q1=q2;
q2=temp;
}
public int pop() {
return q1.poll();
}
public int top() {
//返回队尾元素
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}
20. 有效的括号
本题解题思路:遇到左括号就入栈,遇到右括号就出栈寻找最近的左括号,看是否匹配
class Solution {
public boolean isValid(String s) {
Stack<Character> left=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
//这行和上面这行可以改写为
// for(char c:s.toCharArray()) toCharArray是将字符串转换为字符数组
if(c=='('||c=='{'||c=='['){
left.push(c);
}else{
if(!left.empty()&&leftOf(c)==left.peek()){
left.pop();
}
else{
return false;
}
}
}
return left.empty();
}
char leftOf(char c){
if(c=='}') return '{';
if(c==']') return '[';
return '(';
}
}