1.最小栈
class MinStack {
Stack <Integer>stack;
Stack <Integer>minStack;
public MinStack() {
stack=new Stack<>();
minStack=new Stack<>();
}
public void push(int val) {
stack.push(val);
if(minStack.empty()) {
minStack.push(val);
} else {
int topval=minStack.peek();
if(val<=topval) {
minStack.push(val);
}
}
}
public void pop() {
if(stack.peek().equals(minStack.peek())) {
minStack.pop();
}
stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
2. 括号匹配
public class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch=s.charAt(i);
if(ch=='{'||ch=='['||ch=='(') {
stack.push(ch);
} else if (stack.empty()){
return false;
} else if(stack.peek().equals('(')&&ch==')'||
stack.peek().equals('{')&&ch=='}'||
stack.peek().equals('[')&&ch==']'){
stack.pop();
} else {
return false;
}
}
return stack.empty();
}
}
3. 逆波兰表达式求值
public class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack=new Stack<>();
for (int i = 0; i <tokens.length; i++) {
if(opinion(tokens[i])) {
int val1=stack.pop();
int val2=stack.pop();
switch(tokens[i]) {
case "+":
stack.push(val1+val2);
break;
case "-":
stack.push(val2-val1);
break;
case "*":
stack.push(val1*val2);
break;
case "/":
stack.push(val2/val1);
break;
}
} else {
stack.push(Integer.parseInt(tokens[i]));
}
}
return stack.pop();
}
private boolean opinion(String ch) {
return ch.equals("*")||ch.equals("+")
||ch.equals("/")||ch.equals("-");
}
}
4.出栈入栈次序匹配
public boolean IsPopOrder (int[] pushV, int[] popV) {
Stack<Integer> stack1=new Stack();
int j=0;
for(int i=0;i<pushV.length;i++) {
stack1.push(pushV[i]);
while(j<popV.length&&!stack1.empty()&&stack1.peek()==popV[j]) {
stack1.pop();
j++;
}
}
return stack1.empty();
}
}
5. 用队列实现栈。OJ链接
public class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1=new LinkedList<>();
queue2=new LinkedList<>();
}
public void push(int x) {
if(empty()){
queue1.offer(x);
} else if (!queue2.isEmpty()){
queue2.offer(x);
} else {
queue1.offer(x);
}
}
public int pop() {
int val=0;
if(empty()) {
return -1;
} else {
if (!queue1.isEmpty()) {
int count=queue1.size()-1;
while(count!=0) {
queue2.offer(queue1.poll());
count--;
}
val=queue1.poll();
}else {
int count=queue2.size()-1;
while(count!=0) {
queue1.offer(queue2.poll());
count--;
}
val= queue2.poll();
}
}
return val;
}
public int top() {
int temp=0;
if(empty()) {
return -1;
} else {
if (!queue1.isEmpty()) {
int count=queue1.size();
while(count!=0) {
temp=queue1.peek();
queue2.offer(queue1.poll());
count--;
}
}else {
int count=queue2.size();
while(count!=0) {
temp=queue2.peek();
queue1.offer(queue2.poll());
count--;
}
}
}
return temp;
}
public boolean empty() {
return queue1.isEmpty()&&queue2.isEmpty();
}
}
2. 用栈实现队列。OJ链接
public class MyQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
public MyQueue() {
stack1=new Stack<>();
stack2=new Stack<>();
}
public void push(int x) {
stack1.push(x);
}
public int pop() {
if(!stack2.empty()) {
int val= stack2.pop();
return val;
} else if(!stack1.empty()) {
int count = stack1.size();
while(count!=0) {
stack2.push(stack1.pop());
count--;
}
return stack2.pop();
}
return -1;
}
public int peek() {
if(!stack2.empty()) {
int val= stack2.peek();
return val;
} else if(!stack1.empty()) {
int count = stack1.size();
while(count!=0) {
stack2.push(stack1.pop());
count--;
}
int val=stack2.peek();
return val;
}
return -1;
}
public boolean empty() {
return stack1.empty()&&stack2.empty();
}
}