Queue using Two Stacks

Sort by

recency

|

244 Discussions

|

  • + 0 comments

    I hate on leetcode style questions but my views are slowly changing. It's pretty cool to learn that by popping a LIFO into another LIFO you get a FIFO.

  • + 0 comments

    C# solution:

    using System.Collections.Generic;
    
    class Solution {
        static void Main(String[] args) {
            (Stack<int> s1, Stack<int> s2) = (new(), new());
            var n = int.Parse(Console.ReadLine());
            for (var _ = 0; _ < n; _++)
            {
                var parameters = Console.ReadLine().Split();
                var operation = parameters[0];
                switch (operation)
                {
                    case "1":
                        s2.Push(int.Parse(parameters[1]));
                        break;
                    case "2":
                    case "3":
                        if (s1.Count == 0)
                        {
                            while (s2.Count > 0)
                            {
                                s1.Push(s2.Pop());
                            }
                        }
                        if (operation == "3")
                        {
                            Console.WriteLine(s1.Peek());
                            break;
                        }
                        s1.Pop();
                        break;
                    default:
                        break;
                }
            }
        }
    }
    
  • + 0 comments

    My answer with Typescript, cause no starting function, i was write for myself

    function main() {
        const ws: WriteStream = createWriteStream(process.env['OUTPUT_PATH']);
        const querys_count: number = parseInt(readLine().trim(), 10);
        const queues: number[] = []
    
        for (let i = 0; i < querys_count; i++) {
            let [type, queue] = readLine().split(' ').map(sTemp => parseInt(sTemp, 10));
            switch (type) {
                case 1: queues.push(queue); break;
                case 2: queues.shift(); break;
                case 3: ws.write(queues[0] + '\n'); break;
            }
        }
    
        ws.end();
    }
    
  • + 0 comments

    JavaScript Solution:-

    function processData(input) {
        let queries = input.split('\n');
        let q = parseInt(queries[0]);  
        let stack1 = [];
        let stack2 = [];
        for (let i = 1; i <= q; i++) {
            let query = queries[i].split('  ');
            let type = parseInt(query[0]);
            if (type === 1) {
                 
                let x = parseInt(query[1]);
                stack1.push(x);
            } else if (type === 2) {
                if (stack2.length === 0) {
                    while (stack1.length > 0) {
                        stack2.push(stack1.pop());
                    }
                }
                stack2.pop();
            } else if (type === 3) {
                if (stack2.length === 0) {
                    while (stack1.length > 0) {
                        stack2.push(stack1.pop());
                    }
                }
                console.log(stack2[stack2.length - 1]);  
            }
        }
    }
    
  • + 0 comments

    Python Solution

    # Enter your code here. Read input from STDIN. Print output to STDOUT
    class Queue: # Costly DeQueue
        # Queue using two stacks with costly deQueue()
        def __init__(self):
            self.s1 = []  # Stacks
            self.s2 = []  # Stacks
            # Note that for Stacks, we can either do append() or pop()
    
        # EnQueue item to the queue
        def enQueue(self, x):
            self.s1.append(x)
    
        # DeQueue item from the queue
        def deQueue(self):
            # if s2 is empty and s1 has elements
            if not self.s2:
                while self.s1:
                    self.s2.append(self.s1.pop())
            return self.s2.pop() if self.s2 else None
    
        def peek(self):
            if not self.s2:
                while self.s1:
                    self.s2.append(self.s1.pop())
            return self.s2[-1] if self.s2 else None
    
    queue = Queue()
    for i in range(int(input())):
        query = input().split(" ")
        if query[0] == "1": # enqueue
            queue.enQueue(query[1])
        elif query[0] == "2":  # pop (dequeue front element)
            queue.deQueue()
        elif query[0] == "3":  # print
            print(queue.peek())
        else:
            print("ERROR!") # Should never reach here