232. Implement Queue using Stacks&225. Implement Stack using Queues

题目:使用栈来实现队列

Implement the following operations of a queue using stacks.

push(x) – Push element x to the back of queue.
pop() – Removes the element from in front of queue.
peek() – Get the front element.
empty() – Return whether the queue is empty.
Notes:
You must use only standard operations of a stack – which means only push to top, peek/pop from top, size, and is empty operations are valid.
Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).

源码

class Queue {
private:
    stack<int>s1,s2;
public:
    // Push element x to the back of queue.
    void push(int x) {
        s1.push(x);//将元素x放入栈s1中
    }

//top()是取栈顶元素
//pop()是弹出栈顶元素
    // Removes the element from in front of queue.
    void pop(void) {
        if(!s2.empty()){
            s2.pop();//若s2不为空,s2栈弹出
        }else{
            while(!s1.empty()){
                s2.push(s1.top());
                //s2为空的时候,将s1栈顶元素全部取出但不弹出
                s1.pop();//最后弹出s1栈顶元素
            }
            s2.pop();//弹出s2栈顶所有元素
        }
    }

    // Get the front element.
    int peek(void) {
        if(!s2.empty()){
          return  s2.top();
        }else{
            while(!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }
          return s2.top();//int类型一定记得return返回
        }
    }

    // Return whether the queue is empty.
    bool empty(void) {
        return s1.empty()&&s2.empty();
    }
};

题目:使用队列实现栈

Implement the following operations of a stack using queues.

push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
empty() – Return whether the stack is empty.
Notes:
You must use only standard operations of a queue – which means only push to back, peek/pop from front, size, and is empty operations are valid.
Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).

源码

class Stack {
private:
    queue<int> q1, q2;
public:
    // Push element x onto stack.
    void push(int x) {
        if(q1.empty()){
            q1.push(x);//将元素X放入q1队列中
            while(!q2.empty()){
            //如果q2不为空,循环一直进行
                q1.push(q2.front());
                //将q2的队首放在q1中
                q2.pop();//弹出q2,不断执行直到q2为空。
            }
        }else{
            q2.push(x);
            while(!q1.empty()){
                q2.push(q1.front());
                q1.pop();
            }
        }
    }

    // Removes the element on top of the stack.
    void pop() {
        if(!q1.empty()){
            q1.pop();
        }else{
            q2.pop();
        }
    }

    // Get the top element.
    int top() {
        if(!q1.empty()){
            return q1.front();
        }else{
            return q2.front();
        }
    }

    // Return whether the stack is empty.
    bool empty() {
        return q1.empty()&&q2.empty();
    }
};
在实现队列(Queue)的数据结构时,可以使用链表(Linked Lists)和数组(Arrays)这两种常见的数据结构。 a. 使用链接列表(Linked List)实现队列: ```python class Node: def __init__(self, data): self.data = data self.next = None class QueueLL: def __init__(self): self.head = None self.tail = None # 入队操作(enqueue) def enqueue(self, data): new_node = Node(data) if not self.is_empty(): self.tail.next = new_node else: self.head = new_node self.tail = new_node # 出队操作(dequeue) def dequeue(self): if self.is_empty(): return None temp_data = self.head.data self.head = self.head.next if self.is_empty(): self.tail = None return temp_data # 检查队列是否为空 def is_empty(self): return self.head is None # 显示队列元素 def display(self): current = self.head while current: print(current.data, end=" -> ") current = current.next print("None") ``` b. 使用数组实现队列(Array-Based Queue): ```python class QueueArray: def __init__(self, capacity): self.queue = [None] * capacity self.front = -1 self.rear = -1 def is_empty(self): return self.front == self.rear def enqueue(self, data): if (self.rear + 1) % len(self.queue) == self.front: raise Exception("Queue full") if self.is_empty(): self.front = self.rear = 0 else: self.rear = (self.rear + 1) % len(self.queue) self.queue[self.rear] = data def dequeue(self): if self.is_empty(): raise Exception("Queue empty") value = self.queue[self.front] if self.front == self.rear: self.front = self.rear = -1 else: self.front = (self.front + 1) % len(self.queue) return value def display(self): if self.is_empty(): print("Queue is empty") else: index = self.front while True: try: print(self.queue[index], end=" -> ") index = (index + 1) % len(self.queue) except IndexError: break print("None") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值