1.栈实现队列:
利用两个栈实现队列,定义一个输入栈和输出栈,一个用来存输入的数,一个用来存输出的数,实现先入先出,在存入数据的时候,存进输入栈;当输出的时候利用输出的栈,改变顺序。
解题步骤:
- 增加:直接push进输入栈中
- pop:讲输入栈弹出并存进输出栈中,并返回输出栈顶元素
- peek:讲输入栈弹出并存进输出栈中,弹回返回输出栈顶元素
- dumpstackin:讲输入栈数据倒入输出站中
代码实现:
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>(); // 负责进栈
stackOut = new Stack<>(); // 负责出栈
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpStackIn();
return stackOut.pop();
}
public int peek() {
dumpStackIn();
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty()&&stackOut.isEmpty();
}
public void dumpStackIn(){
if(!stackOut.isEmpty()){
return;
}
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
2.有效的括号
利用栈来实现,当栈为空的时候,就将符号存入栈中,若符号和栈顶元素匹配成功,则将元素弹出栈中。
实现步骤:
- 利用for循环来遍历字符串,并将字符取出
- 定义一个栈,并讲字符和栈顶字符进行匹配,若匹配不成功则存入栈中
- 若匹配成功则弹出栈顶元素
- 最后若栈有剩余元素,即匹配未成功的元素,则返回false
代码实现:
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
for(int i=0;i<s.length();i++){
char ch = s.charAt(i);
if(deque.isEmpty()){
deque.push(ch);
}else if(ch==')'&&deque.peek()=='('){
deque.pop();
}else if(ch==']'&&deque.peek()=='['){
deque.pop();
}else if(ch=='}'&&deque.peek()=='{'){
deque.pop();
}else{
deque.push(ch);
}
}
if(!deque.isEmpty()){
return false;
}
return true;
}
3.用队列实现栈
本题利用一个队列就可以实现,在存入数据时,正常讲数据存进队列中,在取出数据时,讲队首元素取出,并重新放入队列的尾部,取出元素至最后一个元素时,停止操作并返回最后一个元素。
实现步骤:
- push:正常讲元素push
- pop:弹出元素是核心步骤,首先算出队列的长度size。然后讲size--,让取出元素时到最后一个元素停止,返回队首元素。
- top:返回队尾元素
- empty:直接调用方法判断是否为空
代码如下:
// Deque 接口继承了 Queue 接口
// 所以 Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirst
Deque<Integer> que1;
public MyStack() {
que1 = new ArrayDeque<>();
}
public void push(int x) {
que1.addLast(x);
}
public int pop() {
int size = que1.size();
size--;
while(size>0){
que1.addLast(que1.pollFirst());
size--;
}
int res = que1.pollFirst();
return res;
}
public int top() {
return que1.peekLast();
}
public boolean empty() {
return que1.isEmpty();
}
4.删除字符串中所有相邻重复项
本题利用栈来解决匹配问题很方便,我们遍历字符串的同时判断栈顶元素是否和遍历的元素是否相同,若相同则弹出栈顶元素,重复此操作直至遍历结束。
解题步骤:
- 定义一个栈,用来存放待遍历的元素
- 再存入元素的同时判断待遍历的元素和栈顶元素是否相同,若相同则取出,不同则存入
- 遍历结束时,依次取出元素
代码如下:
//c++语言实现
string removeDuplicates(string S) {
string result;
for(char s : S) {
if(result.empty() || result.back() != s) {
result.push_back(s);
}
else {
result.pop_back();
}
}
return result;
}
//队列实现
public String removeDuplicates(String s) {
Deque<Character> deque = new ArrayDeque();
for(int i=0;i<s.length();i++){
char ch = s.charAt(i);
if(deque.isEmpty()){
deque.addLast(ch);
}else if(ch==deque.peekLast()){
deque.pollLast();
}else{
deque.addLast(ch);
}
}
String res = "";
for(char c:deque){
res+=c;
}
return res;
}
}