• C#实现栈和队列


      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace StackAndQueue
      8 {
      9     class Program
     10     {
     11         static void Main(string[] args)
     12         {
     13             //定义栈
     14             MyStack<string> myStack = new MyStack<string>();
     15             //定义队
     16             MyQueue<string> myQueue = new MyQueue<string>();
     17 
     18             myStack.Push("one");
     19             myStack.Push("two");
     20             myStack.Push("three");
     21             myStack.Push("four");
     22             myStack.Push("five");
     23             Console.WriteLine(myStack.Count);
     24             //出five
     25             Console.WriteLine(myStack.Pop());
     26             Console.WriteLine(myStack.Count);
     27             //出four
     28             Console.WriteLine(myStack.Pop());
     29             Console.WriteLine(myStack.Count);
     30             //出three
     31             Console.WriteLine(myStack.Pop());
     32             Console.WriteLine(myStack.Count);
     33             //出two
     34             Console.WriteLine(myStack.Pop());
     35             Console.WriteLine(myStack.Count);
     36             //出one
     37             Console.WriteLine(myStack.Pop());
     38             Console.WriteLine(myStack.Count);
     39             //判空
     40             Console.WriteLine(myStack.Pop());
     41             Console.WriteLine(myStack.Count);
     42 
     43             //myQueue.EnQue("one");
     44             //myQueue.EnQue("two");
     45             //myQueue.EnQue("three");
     46             //myQueue.EnQue("four");
     47             //myQueue.EnQue("five");
     48             //Console.WriteLine(myQueue.Count);
     49             ////出one
     50             //Console.WriteLine(myQueue.DeQue());
     51             //Console.WriteLine(myQueue.Count);
     52             ////出two
     53             //Console.WriteLine(myQueue.DeQue());
     54             //Console.WriteLine(myQueue.Count);
     55             ////出three
     56             //Console.WriteLine(myQueue.DeQue());
     57             //Console.WriteLine(myQueue.Count);
     58             ////出four
     59             //Console.WriteLine(myQueue.DeQue());
     60             //Console.WriteLine(myQueue.Count);
     61             ////出five
     62             //Console.WriteLine(myQueue.DeQue());
     63             //Console.WriteLine(myQueue.Count);
     64             ////判空
     65             //Console.WriteLine(myQueue.DeQue());
     66             //Console.WriteLine(myQueue.Count);
     67 
     68         }
     69 
     70         //结点类
     71         public class Node<T>
     72         {
     73             public T data;
     74             public Node<T> next;
     75 
     76             public T Data
     77             {
     78                 get
     79                 {
     80                     return data;
     81                 }
     82                 set
     83                 {
     84                     data = value;
     85                 }
     86             }
     87 
     88             public Node<T> Next
     89             {
     90                 get
     91                 {
     92                     return next;
     93                 }
     94                 set
     95                 {
     96                     next = value;
     97                 }
     98             }
     99 
    100             public Node(T data)
    101             {
    102                 this.data = data;
    103                 next = null;
    104             }
    105         }
    106 
    107         // 抽象一个简单父类
    108         // 为栈和队列提取一些通用的成员,抽象出一个父类,此处用接口还是抽象函数?
    109         // 在C#中Stack和Queue继承自两个接口:IEnumerable<T>, ICollection。
    110         // 但是作为简单的实现(特别是作为面试题答案),还是写成抽象类比较好,原因有二:
    111         // 1. 可以在抽象类中实现一些通用方法,子类只需要继承就可以直接用,可以简化代码。
    112         // 2. 抽象出来的父类,和子类Stack、Queue可以看做“is-a”的关系。
    113         // 当然也可以是非抽象的普通类,但是处于“不能实例化”的考虑,应该是抽象的
    114         public abstract class AbstrackList<T>
    115         {
    116             //当前节点个数
    117             protected int count;
    118 
    119             //头节点,其后才是第一个节点
    120             //应该为proteced,对外不可见
    121             protected Node<T> Head { get; set; }
    122 
    123             //尾节点,即最后一个节点
    124             protected Node<T> Tail { get; set; }
    125 
    126             //当前节点个数,只读
    127             public int Count
    128             {
    129                 get
    130                 {
    131                     return count;
    132                 }
    133             }
    134 
    135             //构造函数,初始化头节点和节点个数
    136             protected AbstrackList()
    137             {
    138                 Head = new Node<T>(default(T));
    139                 Tail = Head;
    140                 count = 0;
    141             }
    142 
    143             //判空
    144             public bool IsEmpty()
    145             {
    146                 return count == 0 ? true : false;
    147             }
    148 
    149             //“出”的操作,对于栈和队是一样的,可以卸载父类里
    150             //tip:应该从“头”出
    151             //“头”出:时间复杂度为O(1);
    152             //“尾”出:时间复杂度为O(n);
    153             protected T Out()
    154             {
    155                 //判空
    156                 if (Head.Next == null || count == 0)
    157                 {
    158                     Console.WriteLine("Is empty!");
    159                     return default(T);
    160                 }
    161                 Node<T> outNode = Head.Next;
    162                 Head.Next = outNode.Next;
    163                 count--;
    164                 return outNode.Data;
    165             }
    166 
    167             //对于“入”的操作,栈和队是有区别的,所以定义抽象方法
    168             protected abstract void In(T nodeData);
    169         }
    170 
    171         //实现栈
    172         public class MyStack<T> : AbstrackList<T>
    173         {
    174             //实现“入栈”的方法
    175             protected override void In(T nodeData)
    176             {
    177                 Node<T> node = new Node<T>(nodeData);
    178                 node.Next = Head.Next;
    179                 Head.Next = node;
    180                 count++;
    181             }
    182 
    183             //入栈
    184             public void Push(T nodeData)
    185             {
    186                 In(nodeData);
    187             }
    188 
    189             //出栈
    190             public T Pop()
    191             {
    192                 return Out();
    193             }
    194         }
    195 
    196         //实现队
    197         public class MyQueue<T> : AbstrackList<T>
    198         {
    199             //实现“入队”的方法
    200             protected override void In(T nodeData)
    201             {
    202                 Node<T> node = new Node<T>(nodeData);
    203                 Tail.Next = node;
    204                 Tail = node;
    205                 count++;
    206             }
    207 
    208             //入队
    209             public void EnQue(T nodeData)
    210             {
    211                 In(nodeData);
    212             }
    213 
    214             //出队
    215             public T DeQue()
    216             {
    217                 return Out();
    218             }
    219         }
    220     }
    221 }
  • 相关阅读:
    tar压缩
    sh脚本的dos和unix
    hive常用函数
    hive的union问题
    hive行转多列LATERAL VIEW explode
    Iterator和Enumeration
    基础啊基础
    一道考题---当n=1,2,3...2015时,统计3n+n3能整除7的个数
    自然语言处理
    矩阵相乘
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4509698.html
Copyright © 2020-2023  润新知