225. Implement Stack using Queues

225. Implement Stack using Queues

方法1:

连着232. Implement Queue using Stacks, 结果反而花更久时间。。不能直接套用过来。这道题里最后采用了:push只管push就行,popStack每次倒灌过来取出top/pop之后负责再灌回去,包揽所有清理工作。

这样push是O(1), pop/top 都是O(n).

class MyStack {
public:
    /** Initialize your data structure here. */
    MyStack() {
        
    }
    
    /** Push element x onto stack. */
    void push(int x) {
        pushQueue.push(x);
        return;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int N = pushQueue.size();
        for(int i = 0; i < N - 1; i++) {
            popQueue.push(pushQueue.front());
            pushQueue.pop();
        }
        int t = pushQueue.front();
        pushQueue.pop();
        
        while (!popQueue.empty()){
            pushQueue.push(popQueue.front());
            popQueue.pop();
        }
        
        return t;
    }
    
    /** Get the top element. */
    int top() {
        int N = pushQueue.size();
        
        for(int i = 0; i < N - 1; i++) {
            popQueue.push(pushQueue.front());
            pushQueue.pop();
        }
        int t = pushQueue.front();
        popQueue.push(t);
        pushQueue.pop();
        
        while (!popQueue.empty()){
            pushQueue.push(popQueue.front());
            popQueue.pop();
        }
        return t;
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return popQueue.empty() && pushQueue.empty();
    }
private: 
    queue<int> popQueue, pushQueue;
};

/**
 * 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();
 * bool param_4 = obj.empty();
 */

方法2:

grandyang: http://www.cnblogs.com/grandyang/p/4568796.html
参照了grandyang的写法:第一个栈q1正常储存,第二个栈q2永远keep<=1 个元素,每次新进来x会把上一次的top推进q1。如果连续pop,则通过平移的方法再取出上一个top(q1中队尾的元素)。

这种方法push O(1), top O(1), pop O(1), 只有连续pop是O(n)。

class MyStack {
public:
    /** Initialize your data structure here. */
    MyStack() {}
    
    /** Push element x onto stack. */
    void push(int x) {
        q2.push(x);
        while (q2.size() > 1) {
            q1.push(q2.front()); q2.pop();
        }
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int x = top(); q2.pop();
        return x;
    }
    
    /** Get the top element. */
    int top() {
        if (q2.empty()) {
            for (int i = 0; i < (int)q1.size() - 1; ++i) {
                q1.push(q1.front()); q1.pop();
            }
            q2.push(q1.front()); q1.pop();
        }
        return q2.front();
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return q1.empty() && q2.empty();
    }
    
private:
    queue<int> q1, q2;
};

方法3:

grandyang: http://www.cnblogs.com/grandyang/p/4568796.html
grandyang的写法,只需要在push的时候manipulate就行了,而且只用到一个queue。原理是每次入队完全模拟stack的方式:x加入队尾,前面的所有元素依次全部出队再入队,x就变成了top。

class MyStack {
public:
    /** Initialize your data structure here. */
    MyStack() {}
    
    /** Push element x onto stack. */
    void push(int x) {
        q.push(x);
        for (int i = 0; i < (int)q.size() - 1; ++i) {
            q.push(q.front()); q.pop();
        }
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int x = q.front(); q.pop();
        return x;
    }
    
    /** Get the top element. */
    int top() {
        return q.front();
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return q.empty();
    }
    
private:
    queue<int> q;
};
Dataset: Student Records We will implement stack using both array and linked list data structures to store student records. Each student record will have the following information: student name, student ID, and student GPA. 1. Stack using Array: We will use an array to implement stack data structure for storing student records. The array will have a fixed size, and we will use the push, pop, and peek operations to add, remove, and view the top element of the stack, respectively. The Java code for implementing stack using an array is given below: ``` public class StudentRecord { private String name; private int id; private double gpa; public StudentRecord(String name, int id, double gpa) { this.name = name; this.id = id; this.gpa = gpa; } // getters and setters public String toString() { return "Name: " + name + ", ID: " + id + ", GPA: " + gpa; } } public class StudentRecordStack { private StudentRecord[] stack; private int top; private int size; public StudentRecordStack(int size) { stack = new StudentRecord[size]; top = -1; this.size = size; } public void push(StudentRecord record) { if (top == size - 1) { System.out.println("Stack Overflow!"); return; } top++; stack[top] = record; } public StudentRecord pop() { if (top == -1) { System.out.println("Stack Underflow!"); return null; } StudentRecord record = stack[top]; top--; return record; } public StudentRecord peek() { if (top == -1) { System.out.println("Stack Underflow!"); return null; } return stack[top]; } public boolean isEmpty() { return top == -1; } public boolean isFull() { return top == size - 1; } } ``` To test the stack implementation, we can create a few student records and push them onto the stack: ``` public class Main { public static void main(String[] args) { StudentRecordStack stack = new StudentRecordStack(5); StudentRecord record1 = new StudentRecord("John", 1001, 3.5); StudentRecord record2 = new StudentRecord("Jane", 1002, 3.8); StudentRecord record3 = new StudentRecord("Bob", 1003, 3.2); stack.push(record1); stack.push(record2); stack.push(record3); System.out.println(stack.peek()); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); } } ``` Output: ``` Name: Bob, ID: 1003, GPA: 3.2 Name: Bob, ID: 1003, GPA: 3.2 Name: Jane, ID: 1002, GPA: 3.8 Name: John, ID: 1001, GPA: 3.5 Stack Underflow! ``` 2. Stack using Linked List: We will use a linked list to implement stack data structure for storing student records. The linked list will have a dynamic size, and we will use the push, pop, and peek operations to add, remove, and view the top element of the stack, respectively. The Java code for implementing stack using a linked list is given below: ``` public class StudentRecordNode { private StudentRecord record; private StudentRecordNode next; public StudentRecordNode(StudentRecord record) { this.record = record; this.next = null; } // getters and setters } public class StudentRecordStack { private StudentRecordNode top; public StudentRecordStack() { top = null; } public void push(StudentRecord record) { StudentRecordNode node = new StudentRecordNode(record); node.next = top; top = node; } public StudentRecord pop() { if (top == null) { System.out.println("Stack Underflow!"); return null; } StudentRecord record = top.record; top = top.next; return record; } public StudentRecord peek() { if (top == null) { System.out.println("Stack Underflow!"); return null; } return top.record; } public boolean isEmpty() { return top == null; } } ``` To test the stack implementation, we can create a few student records and push them onto the stack: ``` public class Main { public static void main(String[] args) { StudentRecordStack stack = new StudentRecordStack(); StudentRecord record1 = new StudentRecord("John", 1001, 3.5); StudentRecord record2 = new StudentRecord("Jane", 1002, 3.8); StudentRecord record3 = new StudentRecord("Bob", 1003, 3.2); stack.push(record1); stack.push(record2); stack.push(record3); System.out.println(stack.peek()); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); } } ``` Output: ``` Name: Bob, ID: 1003, GPA: 3.2 Name: Bob, ID: 1003, GPA: 3.2 Name: Jane, ID: 1002, GPA: 3.8 Name: John, ID: 1001, GPA: 3.5 Stack Underflow! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值