数据结构-循环顺序队列&链队列

队列接口实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_队列
{
    interface IQueue<T>
    {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Enqueue(T item);
        T Dequeue();
        T Peek();
    }
}

顺序循环队列实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_队列
{
    /// <summary>
    /// 顺序队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class SeqQueue<T> : IQueue<T>
    {
        private T[] data;
        private int count;//当前元素数量
        private int front;//队首 (队首元素索引-1)
        private int rear;//队尾 (队尾元素索引)
        public SeqQueue(int size)
        {
            data = new T[size];
            count = 0;
            front = -1;
            rear = -1;
        }
        public SeqQueue() : this(10) { }
        public int Count
        {
            get
            {
                return count;
            }
        }
        public void Clear()
        {
            count = 0;
            front = rear = -1;

        }
        public int GetLength()
        {
            return count;
        }
        public bool IsEmpty()
        {
            return count == 0;
        }

        /// <summary>
        /// 出队,并删除数据
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (!IsEmpty())
            {
                T temp = data[front + 1];
                front++;
                count--;
                return temp;
            }
            else
            {
                Console.WriteLine("队列为空");
                return default(T);
            }
        }
        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            if (count == data.Length)
            {
                Console.WriteLine("队列已满,不可以再添加新的数据");
            }
            else
            {
                if (rear == data.Length - 1) //判断是否在尾部,是就把元素放在0位置
                {
                    data[0] = item;
                    rear = 0;
                }
                else//不是就继续添加
                {
                    data[rear + 1] = item;
                    rear++;
                }
                count++;
            }
        }

        //取得队首数据
        public T Peek()
        {
            if (IsEmpty())
            {
                return default(T);
            }
            else
            {
                return data[front + 1];
            }
        }
    }
}

链结点:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_队列
{
    class Node<T>
    {
        private T data;
        private Node<T> next;
        public Node(T data)
        {
            this.data = data;
        }
        public T Data
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }
        public Node<T> Next
        {
            get
            {
                return next;
            }
            set
            {
                next = value;
            }
        }
    }
}

链队列实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_队列
{
    /// <summary>
    /// 链队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class LinkQueue<T> : IQueue<T>
    {
        private Node<T> front;
        private Node<T> rear;
        private int count; //元素个数

        public LinkQueue()
        {
            front = null;
            rear = null;
            count = 0;
        }
        public int Count
        {
            get
            {
                return count;
            }
        }
        public int GetLength()
        {
            return count;
        }
        public bool IsEmpty()
        {
            return count == 0;
        }
        public void Clear()
        {
            count = 0;
            front = null;
            rear = null;
        }

        /// <summary>
        /// 出队
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (IsEmpty())
            {
                Console.WriteLine("队列为空,无法出队");
                return default(T);
            }
            else if (count == 1) //等于1  说明 头和尾一样
            {
                T temp = front.Data;
                front = rear = null;
                count = 0;
                return temp;
            }
            else //直接删除头 头变成下一个结点
            {
                T temp = front.Data;
                front = front.Next;
                count--;
                return temp;
            }
        }

        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
                Node<T> newNode = new Node<T>(item);
                if (IsEmpty())
                {
                    front =rear = newNode;
                }
                else
                {
                    rear.Next = newNode;
                    rear = newNode;
                }
                count++;
        }

        public T Peek()
        {
            if (front!=null)
            {
                return front.Data;
            }
            else
            {
                return default(T);
            }
        }

    }
}

栈和队列的应用

       /// <summary>
        /// 使用栈和队列 判断是否为回文
        /// </summary>
        /// <returns></returns>
        public static bool IsPalindrome(string temp)
        {
            Stack<char> stack = new Stack<char>();//先进后出
            LinkQueue<char> queue = new LinkQueue<char>();//先进先出

            string str = temp;
            //进栈 进队
            for (int i = 0; i < str.Length; i++)
            {
                stack.Push(str[i]);
                queue.Enqueue(str[i]);
            }

            //判断前后是否一样
            bool flag = false;
            for (int i = 0; i < str.Length/2; i++)
            {
                if (queue.Dequeue() == stack.Pop())
                {
                    flag = true;
                }
                else
                {
                    flag = false;
                }
            }
            return flag;
        }
时间: 2024-10-09 02:32:14

数据结构-循环顺序队列&链队列的相关文章

数据结构-循环顺序队列的基本操作

//循环顺序队列的基本操作 #include <iostream> #include <string.h> using namespace std; #define MAXLEN 8 #define datatype char #define Status int typedef struct{ datatype s[MAXLEN]; int front; //记录队首的指针 int rear; //记录队尾的指针 }SeqQueue; //初始化 Status InitSeqQu

c/c++链队列

链队列 链队列就是简化了的单链表 nodequeue.h #ifndef __NODEQUEUE__ #define __NODEQUEUE__ #include <stdio.h> #include <malloc.h> #include <assert.h> #include <memory.h> #include <stdbool.h> #define ElemType int typedef struct Node{ ElemType d

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

大话数据结构----循环队列和链式队列

队列(Queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表 队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗. 生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事.为了解决这种效率问题,计算机采用循环队列的方式操作队数据. 循环队列 队列的头尾相接的顺序存储结构称为循环队列. 1.首先循环

数据结构之 — 链队列

这次我们来实现队列.队列也是一种极其重要和基础的数据结构,队列的特点是先进先出(First In Frist On,FIFO). 正如栈一样,队列也是在计算机系统内应用非常广泛的一种数据结构,比如购票,打印机缓冲等等,现实生活中也有很多队列模型的例子,比如上车,买饭,银行医院叫号.... 队列按照存储结构不同也分为顺序队列和链队. 我们这次实现链队. 在这里我们要先说一下顺序队列存在“假溢出”的问题,也就是队列本身并没有满,但是因为不断出队导致游标移动却没有对游标的移动进行任何处理,导致队列似乎

C++循环顺序队列

顾名思义:采用顺序结构存放的队列称为顺序队列 循环顺序队列可以避免队列的假溢出现象的发生.如下图示,循环队列的几种特殊情况. 学习完顺序循环队列个人感觉应该注意的事项: front.rear只是表示在base[i]这个顺序表中的索引值,而不是内存的绝对地址,这样也才在后面的循环的时候处理起来比较方便 队列循环的关键 front=(front+1)%queueSize; 下面是个人的循环队列操作工程文件: //////////////////////////////////////////////

【小白成长撸】--循环顺序队列

1 // 循环顺序队列.cpp : 定义控制台应用程序的入口点. 2 //适合整数 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 7 #define MAXNUM 100 8 #define true 1 9 #define false 0 10 11 typedef struct queue_type 12 { 13 int queue[MAXNUM];//队列的最大值为100 14 int front;//头指针 15 in