zoukankan      html  css  js  c++  java
  • Stack和Queue的C#实现

    一. Stack:

    1. 接口:

        interface IStack<T>
        {
            
    void Push(T item);
            T Pop();
            
    bool IsEmpty();
            T GetTopItem();
        }

    2. 顺序栈:

    代码
        public class SequenceStack<T> : IStack<T>
        {
            
    private const int MAX_COUNT = 1000;
            
    private T[] data;
            
    private int top;

            
    private SequenceStack()
            {
                data 
    = new T[MAX_COUNT];
                top 
    = -1;
            }

            
    public static SequenceStack<T> CreateStack()
            {
                
    return new SequenceStack<T>();
            }

            
    public bool IsEmpty()
            {
                
    return top < 0;
            }

            
    public bool IsFull()
            {
                
    return top == MAX_COUNT;
            }

            
    public void Push(T item)
            {
                
    if (IsFull())
                {
                    
    throw new Exception("Stack is full!");
                }

                data[
    ++top] = item;
            }

            
    public T Pop()
            {
                
    if (IsEmpty())
                {
                    
    throw new Exception("Stack is empty.");
                }

                
    return data[top--];
            }

            
    public T GetTopItem()
            {
                
    if (IsEmpty())
                {
                    
    throw new Exception("Stack is empty.");
                }

                
    return data[top];
            }
        }

    3. 链表栈:

    代码
        public class LinkStackNode<T>
        {
            
    public T Data { setget; }
            
    public LinkStackNode<T> Next { setget; }
        }

        
    public class LinkStack<T> : IStack<T>
        {
            
    private LinkStackNode<T> top;

            
    private LinkStack()
            {
                top 
    = null;
            }

            
    public static LinkStack<T> CreateStack()
            {
                
    return new LinkStack<T>();
            }

            
    public bool IsEmpty()
            {
                
    return top == null;
            }

            
    public void Push(T item)
            {
                
    if (top == null)
                {
                    top 
    = new LinkStackNode<T>
                    {
                        Data 
    = item,
                        Next 
    = null
                    };
                }
                
    else
                {
                    top 
    = new LinkStackNode<T>
                    {
                        Data 
    = item,
                        Next 
    = top
                    };
                }
            }

            
    public T Pop()
            {
                
    if (IsEmpty())
                {
                    
    throw new Exception("Stack is empty.");
                }

                T data 
    = top.Data;
                top 
    = top.Next;

                
    return data;
            }

            
    public T GetTopItem()
            {
                
    if (IsEmpty())
                {
                    
    throw new Exception("Stack is empty.");
                }

                
    return top.Data;
            }
        }

    4. 测试:

    代码
                //IStack<int> stack = SequenceStack<int>.CreateStack();
                
    //bool firstIsEmpty = stack.IsEmpty();
                
    //stack.Push(1);
                
    //bool secondIsEmpty = stack.IsEmpty();
                
    //stack.Push(2);
                
    //stack.Push(3);
                
    //int popItem = stack.Pop();
                
    //stack.Push(4);
                
    //int topItem = stack.GetTopItem();

                IStack
    <int> stack = LinkStack<int>.CreateStack();
                
    bool firstIsEmpty = stack.IsEmpty();
                stack.Push(
    1);
                
    bool secondIsEmpty = stack.IsEmpty();
                stack.Push(
    2);
                stack.Push(
    3);
                
    int popItem = stack.Pop();
                stack.Push(
    4);
                
    int topItem = stack.GetTopItem();

     二. Queue:

    1. 接口: 

        interface IQueue<T>
        {
            
    bool IsEmpty();
            
    void InQueue(T item);
            T DeQueue();
            T GetTopItem();
        }

    2. 顺序队列:

    代码
        class SequenceQueue<T> : IQueue<T>
        {
            
    private const int MAX_COUNT = 1000;
            
    private int front, rear;
            
    private T[] data;

            
    private SequenceQueue()
            {
                data 
    = new T[MAX_COUNT];
                front 
    = rear = -1;
            }

            
    public static SequenceQueue<T> CreateQueue()
            {
                
    return new SequenceQueue<T>();
            }

            
    public bool IsEmpty()
            {
                
    return front == rear;
            }

            
    public bool IsFull()
            {
                
    return rear == MAX_COUNT;
            }

            
    public void InQueue(T item)
            {
                
    if (IsFull())
                {
                    
    throw new Exception("Queue is full.");
                }

                data[
    ++rear] = item;
            }

            
    public T DeQueue()
            {
                
    if(IsEmpty())
                {
                    
    throw new OverflowException("Queue is empty.");
                }

                
    return data[++front];
            }

            
    public T GetTopItem()
            {
                
    if (IsEmpty())
                {
                    
    throw new OverflowException("Queue is empty.");
                }

                
    return data[rear];
            }
        }

    3. 链表队列:

    代码
        public class LinkQueueNode<T>
        {
            
    public T Data { setget; }
            
    public LinkQueueNode<T> Next { setget; }
        }

        
    class LinkQueue<T> : IQueue<T>
        {
            
    private LinkQueueNode<T> front, rear;

            
    private LinkQueue()
            {
                front 
    = rear = null;
            }

            
    public static LinkQueue<T> CreateQueue()
            {
                
    return new LinkQueue<T>();
            }

            
    public bool IsEmpty()
            {
                
    return front == null;
            }

            
    public void InQueue(T item)
            {
                LinkQueueNode
    <T> node = new LinkQueueNode<T>
                {
                    Data 
    = item,
                    Next 
    = null
                };

                
    if (front == null)
                {
                    front 
    = node;
                }
                
    else
                {
                    rear.Next 
    = node;
                }

                rear 
    = node;
            }

            
    public T DeQueue()
            {
                
    if (IsEmpty())
                {
                    
    throw new OverflowException("Queue is empty.");
                }

                var data 
    = front.Data;
                
    if (rear == front)
                {
                    rear 
    = front.Next;
                }
                front 
    = front.Next;

                
    return data;
            }

            
    public T GetTopItem()
            {
                
    if (IsEmpty())
                {
                    
    throw new OverflowException("Queue is empty.");
                }

                
    return rear.Data;
            }
        }

    4. 测试:

    代码
                //IQueue<int> queue = SequenceQueue<int>.CreateQueue();
                
    //bool firstIsQueueEmpty = queue.IsEmpty();
                
    //queue.InQueue(1);
                
    //queue.InQueue(2);
                
    //bool secondIsQueueEmpty = queue.IsEmpty();
                
    //int deQueueItem = queue.DeQueue();
                
    //queue.InQueue(3);
                
    //int topQueueItem = queue.GetTopItem();

                IQueue
    <int> queue = LinkQueue<int>.CreateQueue();
                
    bool firstIsQueueEmpty = queue.IsEmpty();
                queue.InQueue(
    1);
                queue.InQueue(
    2);
                
    bool secondIsQueueEmpty = queue.IsEmpty();
                
    int deQueueItem = queue.DeQueue();
                queue.InQueue(
    3);
                
    int topQueueItem = queue.GetTopItem();

    Download

  • 相关阅读:
    Yii2 分页
    Yii2 或者当前登录用户帐号
    css3媒体查询判断移动设备横竖屏
    Javascript操作Tr隐藏显示变形~
    php注释标准
    匹配一段html中所有的src
    数据库遇到错误(随时补充)
    NetCore-缓存文件上传和文件流上传
    SVN跨服务器版本迁移
    发票同步微信卡包
  • 原文地址:https://www.cnblogs.com/Langzi127/p/1775794.html
Copyright © 2011-2022 走看看