1.3.48

question:

Two stacks with a deque. Implement two stacks with a single deque so that each operation takes a constant number of deque operations(see EXERCISE 1.3.33).

answer:

import edu.princeton.cs.algs4.*;

public class StackDeque<Item>
{
    private class Stack<Item>
    {
        private class Node
        {
            Item item;
            Node next;
        }
    
        private Node top;
        private int N;
    
        public Stack()
        {
            top = null;
            N = 0;
        }
        
        public boolean isEmpty()
        {
            return N == 0;
        }
        
        public int size()
        {
            return N;
        }
        
        public void push(Item item)
        {
            Node node = new Node();
            node.item = item;
            node.next = null;
            if(N == 0)
            {
                top = node;
                N++;
                return;
            }
            N++;
            node.next = top;
            top = node;
        }
    
        public Item pop()
        {
            if(N == 0)
            {
                return null;
            }
            N--;
            Item item = top.item;
            top = top.next;
            return item;
        }
    }
    //从这开始看,之前的是栈类
    private Stack<Item> left;
    private Stack<Item> right;
    private int stequeN;
    
    public StackDeque()
    {
        left = new Stack<Item>();
        right = new Stack<Item>();
        stequeN = 0;
    }
    
    public boolean isEmpty()
    {
        return stequeN == 0;
    }
    
    public int size()
    {
        stequeN = left.size() + right.size();
        return stequeN;
    }
    
    public void pushLeft(Item item)
    {
        left.push(item);
        stequeN = left.size() + right.size();
    }
    
    public void pushRight(Item item)
    {
        right.push(item);
        stequeN = left.size() + right.size();;
    }
    
    public Item popLeft()
    {
        Item item = left.pop();
        stequeN = left.size() + right.size();
        return item;
    }
    
    public Item popRight()
    {
        Item item = right.pop();
        stequeN = left.size() + right.size();
        return item;
    }
    
    public static void main(String[] args)
    {
        StackDeque<String> deque = new StackDeque<String>();
        deque.pushLeft("w");
        deque.pushRight("j");
        deque.pushRight("c");
        StdOut.println(deque.size());
        StdOut.print(deque.popLeft() + "\t");
        StdOut.print(deque.popLeft() + "\t");
        StdOut.print(deque.popRight() + "\t");
        StdOut.println("\n" + deque.size());
    }
}

猜你喜欢

转载自www.cnblogs.com/w-j-c/p/9093496.html