004-关于栈和队列的学习

今天我们要学习的有三个内容,栈、队列、和后缀表达式-中缀表达式的相互转换,但是我们的重点是第三个,因为栈与队列本质就是线性表,第三个的知识比较冷门,所以有必要学习一下。
栈与队列用八个字来说明:先进后出、先进先出。还有我们就不说明顺序的,因为在昨天中已经说的比较明白了,所以直接就说链式的了。
队列,我们首先要创建一个结点类Node,这个在昨天的也是说过了,接着我们就是再创建一个类用于把所有的方法都实现一下。
 private Node front;//头结点
        private Node rear;//尾节点
        private int count;//元素的个数
 
        //构造函数
        public LinkQueue()
        {
            front = null;
            rear = null;
            count = 0;
        }
        public int Count { get { return count; } }
 
        public void Clear()
        {
            front = null;
            rear = null;
            count = 0;
        }
 
        public T Dequeue()
        {
            //三种情况
            if (count == 0)
            {
                Console.WriteLine("空队列,无法取值");
                return default(T);
            }
            else if (count == 1)
            {
                //这样将这个数字出队列的话,这个队列就是一个空队列了
                T temp = front.Data;
                rear = front = null;
                return temp;
            }
            else
            {
                T temp = front.Data;
                front = front.Next;
                count--;
                return temp;
            }
        }
 
        public void Enqueue(T item)
        {
            //入队列首先就是要创建一个结点
            Node newNode = new Node(item);
            if (count == 0)
            {
                front = newNode;
                rear = newNode;
                count++;
            }
            else {
                rear.Next = newNode;
                rear = newNode;
                count++;
            }
        }
 
        public int GetLength()
        {
            return Count;
        }
 
        public bool IsEmpty()
        {
            return Count == 0;
        }
 
        public T Peek()
        {
            if (front != null)
            {
                return front.Data;
            }
            else
            {
                return default(T);
            }
        }
在这里我们就只说明三个方法,入队列,出队列和去队首元素。
1Enqueue()入队列,首先是创建一个结点类用于放置数据,如果在队列中没有一个数据的话,那么这个就是一个空队列,我们的头指针与尾指针指向的都是同一个数据,接着将count++;我们知道队列中入队列都是在队尾插入数据的,只需要将尾指针移动位置即可 。rear.Next = newNode;还有这句话就是将新的结点与之相连。
2Dequeue()出队列,两种情况,一个是队列中只有一个数据的话,那么在将数据返回的时候,必须将头结点与尾节点为null。另一个是有多个数据,队列如果想要出数据的话必须把头数据输出,在输出头数据的时候,头数据的位置就是空的了,那么我们就就要把头结点移动为下一个数据,使之头队列的前面没有数据,front.=front.next;这个写法就能完成这样的操作了。
3 public T Peek()返回队首数据,这个方法是不用删除头队首的,只是得到数据就是,所以不用改变头结点的执行,只用返回数据就行了。我们在创建结点的时候,本身就有一个子结点,自身的子结点就会连接下一个数据,这样每一个数据都会对上一个结点类的成员变量进行赋值,rear.next=newnode;这个代码的意思就是将新结点赋值给上一个结点的子结点,这样新的结点就会成为上一个结点的成员变量,我想这个才是c#中链表的本质吧,并不是我们采用了指针的思想。这个思想在我以前学习过的一个课程就是狼人杀的有关的学习,父类在的构造函数中赋值,这样的话子类就成为父类的一部分,父类就可以对子类的成员变量进行修改。现在我们不学栈的原因是栈我花的时间比较多,队列花的时间比较少,反正他们都是一样的,还有栈与队列的本质就是有限制的线性表。ps:循序线性表还是没有链式线性表方便,时间复杂度高。
接下来就是最后一个内容了,后缀表达式与中缀表达使之间的相互转换。
9+(3-1)*3+10-2       <----->9 3 1-3*+10 2/+
中缀表达式                                后缀表达式
后转中的规则:从左到右遍历表达式的每个数字和符号,遇到是数字进栈,遇到是符号,就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终得到结构。
中转后的规则:从左到右遍历中缀表达式的每一个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
posted @ 2018-10-16 20:15  jake_caiee  阅读(98)  评论(0)    收藏  举报