数据结构》队列(1) 链队列 完整源码
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8a6c68349cf0ffa2ae5b7c1e52fc208e.png)
#include <iostream>
#include <windows.h>
#include <string>
#include "main.h"
using namespace std;
typedef char ElemType;
typedef struct qnode{
ElemType data;
struct qnode *next;
}QueueNode,*QNode;
typedef struct linkqueue{
QNode front;
QNode rear;
}LinkQueue;
bool init_queue(LinkQueue &q);
bool en_queue(LinkQueue &q,ElemType data);
bool de_queue(LinkQueue &q,ElemType &data);
bool clear_queue(LinkQueue &q);
bool judge_empty(LinkQueue q);
bool get_length(LinkQueue q,int &length);
bool get_head(LinkQueue q,ElemType &data);
bool traverse_queue(LinkQueue q);
bool judge_hw();
void show();
void switch_channel(int channel);
LinkQueue q;
ElemType data;
int n,i;
int main()
{
int channel;
do{
show();
cin>>channel;
switch_channel(channel);
cout<<endl;
}while(1);
return 0;
}
void show()
{
cout<<"链队列操作"<<endl;
cout<<"1--初始化、入队元素"<<endl;
cout<<"2--特定位置元素出队"<<endl;
cout<<"3--输出队头元素"<<endl;
cout<<"4--队列长度"<<endl;
cout<<"5--清空栈"<<endl;
cout<<"6--回文"<<endl;
}
void switch_channel(int channel)
{
switch(channel)
{
case 1:{
init_queue(q);
cout<<"请输入要入队列元素的数目:";
cin>>n;
for(i = 0; i < n; i++)
{
cout<<"请输入第"<<i+1<<"个元素:";
cin>>data;
en_queue(q,data);
}
traverse_queue(q);
}break;
case 2:{
de_queue(q,data);
cout<<"出队列元素为:"<<data<<endl;
traverse_queue(q);
}break;
case 3:{
get_head(q,data);
cout<<"列头元素为:"<<data<<endl;
traverse_queue(q);
}break;
case 4:{
get_length(q,n);
cout<<"当前队列长度为:"<<n<<endl;
}break;
case 5:{
clear_queue(q);
traverse_queue(q);
}break;
case 6:{
judge_hw();
}break;
}
}
bool init_queue(LinkQueue &q)
{
q.front = q.rear = new QueueNode;
if(!q.front)
return false;
q.front->next = NULL;
cout<<"初始化完成\n";
return true;
}
bool en_queue(LinkQueue &q,ElemType data)
{
QNode p = new QueueNode;
p->data = data;
q.rear->next = p;
p->next = NULL;
q.rear = p;
return true;
}
bool de_queue(LinkQueue &q,ElemType &data)
{
if(judge_empty(q))
{
cout<<"队列为空"<<endl;
return false;
}
QNode p;
p = q.front;
q.front = q.front->next;
data = q.front->data;
delete p;
return true;
}
bool clear_queue(LinkQueue &q)
{
QNode p;
while(q.front!=q.rear)
{
p = q.front;
q.front = q.front->next;
delete p;
}
cout<<"清空完成"<<endl;
return true;
}
bool judge_empty(LinkQueue q)
{
if(q.front == q.rear)
return true;
return false;
}
bool get_length(LinkQueue q,int &length)
{
length = 0;
while(q.front->next)
{
length++;
q.front = q.front->next;
}
return true;
}
bool get_head(LinkQueue q,ElemType &data)
{
if(judge_empty(q))
{
cout<<"队列为空"<<endl;
return false;
}
data = q.front->next->data;
return true;
}
bool traverse_queue(LinkQueue q)
{
if(judge_empty(q))
{
cout<<"遍历队列--队列为空"<<endl;
return false;
}
cout<<"遍历队列:";
while(q.front->next)
{
cout<<q.front->next->data<<" ";
q.front = q.front->next;
}
cout<<endl;
return true;
}
bool judge_hw()
{
LinkQueue lq;
Sqstack sq;
init_queue(lq);
init_stack(sq);
string s;
int i;
SElemType c1,c2;
cout<<"请输入需要判断是否为回文数的值:";
cin>>s;
for(i=0;i<s.length();i++)
{
push(sq,s[i]);
en_queue(lq,s[i]);
}
while(!judge_empty(lq))
{
pop(sq,c1);
de_queue(lq,c2);
if(c1!=c2)
{
cout<<"不是回文数\n";
return false;
}
}
cout<<"是回文数\n";
return true;
}