● 232.用栈实现队列
1.值得注意
(1)栈的初始化
Stack<Integer> stack = new Stack<>();
(2)栈的使用
// 推入元素
stack.push(10);
stack.push(20);
stack.push(30);
// 查看栈顶元素
System.out.println("栈顶元素: " + stack.peek());
// 弹出元素
System.out.println("弹出: " + stack.pop());
System.out.println("弹出: " + stack.pop());
// 查看栈内剩余元素
System.out.println("栈内元素: " + stack);
2.代码逻辑修正
发现自己逻辑复杂了,如果new_one里面还有数字的话,就优先pop new_one里面的数字,不用管old_one了,如果new_one里面为空,再把所有的old内的数字push进new里面就可以了。
主要思想(代码随想录):
建立两个栈----
(代码随想录code)
3.Code(自己写出)
class MyQueue {
Stack<Integer> old_one;
Stack<Integer> new_one;
int size;
public MyQueue() {
old_one = new Stack<>();
new_one = new Stack<>();
size = 0;
}
public void push(int x) {
old_one.push(x);
size ++;
}
public int pop() {
if (new_one.isEmpty() == true){
while (old_one.isEmpty() == false){
int top = old_one.pop();
new_one.push(top);
}
}
int pop = new_one.pop();
while (new_one.isEmpty() == false){
int top = new_one.pop();
old_one.push(top);
}
size--;
return pop;
}
public int peek() {
if (new_one.isEmpty() == true){
while (old_one.isEmpty() == false){
int top = old_one.pop();
new_one.push(top);
}
}
int peek = new_one.peek();
while (new_one.isEmpty() == false){
int top = new_one.pop();
old_one.push(top);
}
return peek;
}
public boolean empty() {
if (size == 0){
return true;
}else{
return false;
}
}
}
/**
* Your MyQueue object will be instantiated 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();
*/
● 225. 用队列实现栈
1.值得注意
(1)队列的初始化
Queue<Integer> queue = new LinkedList<>();
(2) 队列的操作
改为offer和poll了,初始化是LinkedList
// 入队操作
queue.offer(10);
queue.offer(20);
queue.offer(30);
// 查看队头元素
System.out.println("队头元素: " + queue.peek());
// 出队操作
System.out.println("出队: " + queue.poll());
System.out.println("出队: " + queue.poll());
2.代码逻辑修正
个人代码:我感觉我的代码有点冗余,重复写了比较多,本质还是使用两个队列,分别offer进对方的队列里,其中必然有一方始终为空,另一个队列的本质为一个tmp。
但可以优化,用一个队列写出来(代码随想录)思想不是很难理解,有时间可以实现一下,为什么自己当时没有想到啊哈哈。。
3.Code(自己写出)
class MyStack {
Queue<Integer> queue;
Queue<Integer> tmp_queue;
int size ;
public MyStack() {
queue = new LinkedList<>();
tmp_queue = new LinkedList<>();
size = 0;
}
public void push(int x) {
if (queue.isEmpty() == true){
tmp_queue.offer(x);
}else{
queue.offer(x);
}
size++;
}
public int pop() {
int pop = 0;
if (queue.isEmpty() == false){
while (true){
pop = queue.poll();
if (queue.isEmpty() == true){
break;
}else{
tmp_queue.offer(pop);
}
}
size--;
return pop;
}else{
while (true){
pop = tmp_queue.poll();
if (tmp_queue.isEmpty() == true){
break;
}else{
queue.offer(pop);
}
}
size--;
return pop;
}
}
public int top() {
int pop = 0;
if (queue.isEmpty() == false){
while (true){
pop = queue.poll();
if (queue.isEmpty() == true){
tmp_queue.offer(pop);
break;
}else{
tmp_queue.offer(pop);
}
}
size--;
return pop;
}else{
while (true){
pop = tmp_queue.poll();
if (tmp_queue.isEmpty() == true){
queue.offer(pop);
break;
}else{
queue.offer(pop);
}
}
return pop;
}
}
public boolean empty() {
if (size == 0){
return true;
}else{
return false;
}
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
总结:
- 状态:完结
- 学习1小时左右
- 困难:较为简单
- 待解决问题:。
- 今日收获:队列和栈
- 来源: 代码随想录