• 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

  • 相关阅读:
    Kubernetes之Pod调度约束即将Pod分配给节点
    Kubernetes控制器之DaemonSet
    Kubernetes控制器之StatefulSet
    PureFtpd 连接数据库错误
    Ubuntu 脚本笔记
    饥荒 死亡后不删存档的办法
    浏览器前进后退对下拉框数据的丢失(省市联动实现和例子)
    Mac 设置环境变量
    给现有MVC项目增加Web API支持
    文件编辑器 vi
  • 原文地址:https://www.cnblogs.com/Langzi127/p/1775794.html
Copyright © 2020-2023  润新知