链式循环队列

116 阅读1分钟
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;


//循环队列的链式存储结构
typedef struct LinkNode{
	char data;
	struct LinkNode *next;
} LinkNode;

typedef struct {
	LinkNode *front , *rear;
} LinkQueue;


//循环队列的初始化
void InitQueue(LinkQueue &Q)
{
	//Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));  //建立头节点
	Q.front = Q.rear = new LinkNode;
	if(!Q.front)
        exit(0);
	Q.front->next=NULL;
}

//循环队列的判空
bool IsEmpty(LinkQueue &Q)
{
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}


//循环队列的入队
void EnQueue(LinkQueue &Q, char e) {
	//LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));  //创建新结点,插入到链尾
    LinkNode *s = new LinkNode;
	s->data=e;
	s->next=NULL;
	Q.rear->next=s;
	Q.rear=s;
}

//循环队列的出队
char DeQueue(LinkQueue &Q) {
	if (IsEmpty(Q)){
        cout<<"队列已为空"<<endl;
        exit(0);
	}

    LinkNode *p = Q.front->next; //p指向队头元素
    char e=p->data;
    Q.front->next = p->next;  //修改头指针
	if(Q.rear==p)
        Q.rear=Q.front;  //最后一个元素被删,队尾指针指向头结点
    delete p;
    return e;
}

//取循环队列的队头元素
char GetHead(LinkQueue &Q)
{
	if (Q.front != Q.rear)
	{
	    LinkNode *p = Q.front->next;
	    return p->data;
	}

}

void TraverseQueue(LinkQueue &Q)
{
    LinkNode *p = Q.front->next;    //从队列首节点开始遍历(非头节点,注意区分)

    while (p != NULL) {
        cout<<p->data;
        p = p->next;
    }
}


int main()
{
    //freopen("input.txt", "r", stdin);
    LinkQueue Q;
    int n;char e;

    InitQueue(Q);

    cout<<"输入队列的长度:"<<endl;
    cin>>n;
    cout<<"输入队列的元素:"<<endl;
    for (int i = 1; i <= n; i++){
        cin>>e;
        EnQueue(Q, e);
    }

    cout<<"现在队首元素是:";
    cout<<GetHead(Q)<<endl;


    cout<<"遍历队列结果为:";
    TraverseQueue(Q);


    cout<<endl<<"请输入要插入的元素的数值:";
    cin>>e;
    EnQueue(Q,e);


    cout<<endl<<"遍历队列结果为:";
    TraverseQueue(Q);


    cout<<endl<<"执行删除动作,被删元素是:"<<DeQueue(Q)<<endl;


    cout<<"遍历队列结果为:";
    TraverseQueue(Q);
    cout<<endl;


    if (IsEmpty(Q))
        cout<<"队列为空"<<endl;
    else
        cout<<"队列非空"<<endl;


    return 0;

}