C#中的栈与队列/练习

发布时间 2023-10-24 11:10:33作者: honyide

C#栈和队列的实现

用双向链表实现一个队列

public class DoubleNode
{
    public int Value;
    public DoubleNode pre;
    public DoubleNode next;
    public DoubleNode(int value)
    {
        this.Value = value;
        this.pre=null;
        this.next=null;
    }
}
public class MyQueue//使用双向链表实现队列
{
    public DoubleNode head;
    public DoubleNode tail;
    public void AddFromHead(DoubleNode node)//从队头插入节点
    {
        if(head == null)
        {
            head = node;
            tail = node;
        }
        else
        {
            node.next = head;
            head.pre = node;
            head = node; 
        }
    }
    public void AddFromTail(DoubleNode node)//从队尾插入节点
    {
        if(tail == null)
        {
            tail = node;
            head=node;
        }
        else
        {
            node.pre = tail;
            tail.next = node;
            tail = node;
        }
    }
    public DoubleNode PopFromHead()//从队头弹出节点
    {
        if (head == null) return null;
        DoubleNode res = head;
        if (head==tail)
        {
            head=null;
            tail=null;
        }
        else
        {
            head = head.next;
            res.next=null;
            head.pre=null;
        } 
        return res;
    }
    public DoubleNode PopFromTail()//从队尾弹出节点
    {
        if (tail==null) return null;
        DoubleNode res=tail;
        if (head==tail)
        {
            head=null;
            tail=null;
        }
        else
        {
            tail=tail.pre;
            res.pre=null;
            tail.next=null;
        }
        return res;
    }
}

使用双向链表实现栈

 public class MyStack//使用双向链表实现栈
    {
        public DoubleNode Head;
        public DoubleNode Tail;
        
        public void Push(int value)
        {
            DoubleNode temp = new DoubleNode(value); 
            if (Head == null)
            {
                Head = temp;
                Tail= temp;
            }
            else
            { 
                temp.next= Head;
                Head.pre = temp;
                Head = temp;
            }
        }
        public DoubleNode Pop()
        {
            if (Head == null) return null;
            DoubleNode res = Head; 
            if (Head == Tail)
            {
                Head = null; 
                Tail = null; 
                return res;
            } 
            Head = Head.next;
            res.next = null;
            Head.pre = null;
            return res;
        }
        public DoubleNode Peek()
        {
            if (Head == null) return null;
            return Head;
        }
    }

使用数组实现固定最大长度的栈和队列

 public class MyStack1//使用数组实现固定最大长度的栈,暂定为L
 {
     public int[]nums;
     public int index;
     public int limit;
     public MyStack1(int L)
     {
         limit = L;
         nums= new int[limit];
         index=0;
     }
     public void Push(int n)
     {
         if (index<limit)
             nums[index++] = n;
         else
             Console.WriteLine("栈已满");
     }
     public int Pop()
     {
         int res = nums[--index]; 
         return res;
     }
     public int Peek()
     {
         return nums[index-1];
     }
 }

 public class MyQueue1//使用数组实现固定最大长度的队列,暂定为L
 {
     public int[] nums;
     public int headIndex;
     public int tailIndex;
     public int size;
     public int limit;

     public MyQueue1(int L)
     {
         limit = L;
         nums=new int[limit];
         size=0;
         headIndex=0;
         tailIndex=0;
     }
     public int NextIndex(int i)
     {
         return i<=limit-1? i+1:0;
     }

     public void Push(int n)
     {
        if(size==limit)
         {
             Console.WriteLine("队列已经满了");
             return;
         }
        size++;
         nums[tailIndex] = n;
         tailIndex=NextIndex(tailIndex);
     }
     public int Pop()
     {
         if (size==0)
         {
             throw new Exception("队列空了");
         }
         size--;
         int res = nums[headIndex];
         headIndex=NextIndex(headIndex);
         return res;
     }

 }

使用现成的栈结构实现一个能返回最小值的栈

//一个能返回最小值的栈(使用现成的栈结构实现)
    public class MyStackWithNormal //用现成的栈结构实现
    { 
        public Stack<int> stack=new Stack<int>();  
        public Stack<int> minStack=new Stack<int>();
        public void push(int num)
        {
            stack.Push(num);
            if (minStack.Count == 0)
            {
                minStack.Push(num);
            }
            else
            {
                int temp = num > minStack.Peek() ? minStack.Peek() : num;
                minStack.Push(temp);
            }
        }
        public int pop()
        {
            return stack.Pop();
        }
        public int GetMin()
        {
            return minStack.Peek();
        }
    } 

使用现有的栈实现队列,和使用现有的队列实现栈

public class QueueWithStack//使用现有的栈结构实现队列
{
    private Stack<int> stack = new Stack<int>();
    private Stack<int> outStack = new Stack<int>();
    public Stack<int> OutStack { get 
        
        {//往输出栈中加数据时,输出栈必须为空,且必须把存储栈中的数据全部加入输出栈
           if(outStack==null)
            {
            if (stack.Count==0)
            {
                Console.WriteLine("队列为空");
                return null;
            }
                while (stack!=null)
                {
                    outStack.Push(stack.Pop());
                }
                return outStack;
            }
            else
            {
                return outStack;
            }
        }
    }
    public int Peek()
    {
        return outStack.Peek();
    }
    public int Pop() { return OutStack.Pop(); }
    public void Push(int value)
    {
        stack.Push(value);
    }
}


public class StackWithQueue//使用现有的队列结构实现栈
{
    public Queue<int> queue1 = new Queue<int>();
    public Queue<int> queue2 = new Queue<int>();

    public void Push(int n)
    {
        queue1.Enqueue(n); 
    }
    public int Peek()
    {
    if (queue1.Count==0 &&queue2.Count==0)
    {
        throw new Exception("栈为空");
    }
    Queue<int> data=queue1.Count==0 ? queue2 : queue1;
        Queue<int> help=data==queue1? queue2 : queue1;
        while(data.Count > 1)
        {
            help.Enqueue(data.Dequeue());
        }
        int res=data.Peek();
        help.Enqueue(data.Dequeue() );
        return res; 
    }
    public int Pop()
    {
    if( queue1.Count==0 &&queue2.Count==0)
    {
        throw new Exception("栈为空");
    }
        Queue<int> data=queue1.Count==0 ? queue2 : queue1;
        Queue<int> help=data==queue1? queue2 : queue1;
        while(data.Count > 1)
        {
            help.Enqueue(data.Dequeue());
        }
        int res=data.Dequeue();
        return res; 
    }
}