循环链队列

描述
假设以带头节点的循环链表表示队列,并且只设一个指针指向队尾元素节点(不设头指针),节点元素这里设为整型,编写队列的初始化、入队和出队算法。其中入队元素个数n及其节点数据,和出队元素个数m都是从键盘输入(默认n、m都不小于0),然后输出出队元素,出队不合法(自己想想什么情况下不合法)则输出Error。

要求:能进行多次的入队、出队操作。无元素入队时,n=0;无元素出队时m=0。m=0 n=0时,算法结束。

提示:元素出队时的相应各种情况的处理。

 

输入
6 (n的值) 3 (m的值)
-2 0 1 7 10 -1
2 3
4 3
输出
-2 0 1 (出队元素)
7 10 -1
样例输入
6 4
0 3 1 21 9 -1
2 3
5 6
0 0
样例输出
0 3 1 21 
9 -1 5 
提示
当队列中有n个元素,但要求出队m个,并且,m>n时,直接Error,不输出队中元素,但是,该入队的还要入队。(不能因为m>n 就不进行入队操作)
PS:这个题的一个bug改了一下午,看错了题意以为不设头指针误理解为不设头结点。结果可想而知,很长时间才找到bug。做题以后要仔细读题和注意思维的严密性。
#include
using namespace std;
template<class T>
struct Node
{
    T data;
    Node *next;
};
template<class T>
class LinkQueue
{
private:
    int length;
    Node *front,*rear;

public:
    LinkQueue();
    ~LinkQueue();
    void Insert_Queue(T x);
    T Delete_Queue();
    int Get_Length(){return length;}

};
/*      构造队列     */
template<class T>
LinkQueue::LinkQueue()
{
    front=new Node;
    front->next=NULL;
    rear=front;
    length=0;
}
/*      析构       */
template<class T>
LinkQueue::~LinkQueue()
{
     Node *p;
    while(front)
    {
        p=front->next;
        front=front->next;
        delete p;
    }
}
/*        入队       */
template<class T>
void LinkQueue::Insert_Queue(T x)
{
    Node*s;
    s=new Node;
    s->data=x;
    s->next=NULL;
    rear->next=s;
    rear=s;
    length++;
}
/*      出队       */
template<class T>
T LinkQueue::Delete_Queue()
{
    if(rear==front) throw "Error";
    Node *p;
    p=front->next;
    T x=p->data;
    front->next=p->next;
    delete p;
    if(front->next==NULL) rear=front;///删除只有一个元素的时候
    length--;
    return x;
}
int main()
{
    int n,m,x;
    LinkQueue<int> My_queue;
    while(scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0) break;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            My_queue.Insert_Queue(x);
        }
        if(m>My_queue.Get_Length())
        {
            printf("Error\n");
        }
        else
        {
            for(int i=1;i<=m;i++)
            {
                if(i==m)
                {
                    printf("%d\n",My_queue.Delete_Queue());
                }
                else
                {
                     printf("%d ",My_queue.Delete_Queue());
                }
            }
        }


    }
    My_queue.~LinkQueue();
    return 0;
}

 

转载于:https://www.cnblogs.com/dean-SunPeishuai/p/10579443.html

你可能感兴趣的:(循环链队列)