【问题描述】
求解答编程实现链队的入队、出队操作。(需要详细过程。)
链表实现的队列吗?之前给你写过一个啊,那个有什么问题吗?还是说不需要循环链表了?
下面是一个链式队列的代码,运行结果如下(截图不全,入队元素是10、9、8,10和9的入队没截上图):
C代码:
#include <stdio.h>
#include <stdlib.h>
/******************定义链式队列,先进先出x*********************/
typedef struct _node
{
int data;
struct _node* next;
}QueueNode, * Queue;
//初始化队列
Queue Queueinit()
{
Queue head = (Queue)malloc(sizeof(QueueNode));
head->next = 0;
return head;
}
//入队
int Queuepush(Queue q, int c)
{
Queue p = q;
QueueNode* t = (QueueNode*)malloc(sizeof(QueueNode));
int pos = 1;
t->data = c;
t->next = 0;
while (p->next)
{
p = p->next;
pos++;
}
p->next = t;
return pos;
}
//出队,成功出队返回1,出队失败返回0
int Queuepop(Queue q, int* e)
{
Queue p = q->next;
if (q->next == 0)
return 0;
else
{
*e = p->data;
q->next = p->next;
free(p);
p = 0;
return 1;
}
}
//判断是否为空
int Queueempty(Queue q)
{
if (q->next == 0)
return 1;
else
return 0;
}
//获取队顶元素
int Queuetop(Queue q, int* e)
{
Queue p = q->next;
if (q->next == 0)
return 0;
else
{
*e = p->data;
return 1;
}
}
//获取队列长度
int QueueLength(Queue q)
{
Queue p = q->next;
int len = 0;
while (p)
{
len++;
p = p->next;
}
return len;
}
int main()
{
int op; //选项
Queue qq = Queueinit(); //初始化队列
int data;
while (1)
{
printf("链式队列功能演示\n");
printf("1.入队\n");
printf("2.出队\n");
printf("3.获取队顶元素\n");
printf("4.获取队列长度\n");
printf("5.队列元素依次出队并显示\n");
printf("6.结束程序\n");
scanf("%d", &op);
switch(op)
{
case 1:
printf("请输入需要入队的元素:");
scanf("%d", &data);
Queuepush(qq, data);
break;
case 2:
if (Queuepop(qq, &data))
printf("出队元素为%d\n", data);
else
printf("当前队列为空\n");
break;
case 3:
if (Queuetop(qq, &data))
printf("队顶元素为%d\n", data);
else
printf("当前队列为空\n");
break;
case 4:
printf("当前队列长度为%d\n", QueueLength(qq));
break;
case 5:
if (Queueempty(qq))
printf("当前队列为空\n");
else
{
printf("出队元素为:");
while (!Queueempty(qq))
{
Queuepop(qq, &data);
printf("%d ", data);
}
printf("\n");
}
break;
case 6:
return 0;
}
}
return 0;
}
太多了,度娘知道
#include <iostream>
using namespace std;
typedef int DataType;
struct Node{
DataType data;
Node *next;
};
class LinkQueue{
public:
LinkQueue();//初始化空的链表队列
~LinkQueue();//释放链队列的存储空间
void EnQueue(DataType x);//入队操作,将元素x出队
DataType DeQueue();//出队操作,将队头元素出队
DataType GetHead();//取链队列队头元素
int Empty();//判断队列是否为空
private:
Node *front,*rear;//队头和队尾指针
int Len;
};
//链队列基本操作的实现本质上是单链表操作的简单化,且时间复杂度均为O(1)
//构造函数----链队列的初始化
LinkQueue::LinkQueue(){
Node *s=nullptr;
s=new Node;
s->next = nullptr;
front=rear=s;//将队头指针和队尾指针都指向头结点s
}
//析构函数----链队列的销毁【链队列是动态存储分配,需要释放链队列的所有结点的存储空间】
LinkQueue::~LinkQueue(){
while(front){//释放每一个结点的存储空间
rear=front->next;
delete front;
front=rear;
}
}
//入队操作----链队列的插入操作只需考虑在链表的尾部进行
void LinkQueue::EnQueue(DataType x){
Node *s=nullptr;
s=new Node;
s->data=x;s->next=nullptr;
rear->next=s;rear=s;//将结点s插入到队尾
Len++;
}
//出队操作----链队列的删除操作只需考虑在链表的头部进行
DataType LinkQueue::DeQueue(){
DataType x;
Node *p=nullptr;
if(rear == front) throw "下溢";
p=front->next;x=p->data;
front->next=p->next;
//if(!p->next)
if(rear==p) front=rear;
delete p;
Len--;
return x;
}
//取队头元素
DataType LinkQueue::GetHead(){
return front->next->data;
}
//判断队列是否为空
int LinkQueue::Empty(){
if(front==rear) return 1;
else return 0;
}
int main(){
int x;
LinkQueue Q{};//定义对象变量Q
cout<<"对5和8执行入队操作,";
Q.EnQueue(5);
Q.EnQueue(8);
cout<<"当前队头元素为:"<<Q.GetHead()<<endl;//输出队头元素5
try{
x=Q.DeQueue();
cout<<"执行一次出队操作,出队元素是:"<<x<<endl;//输出出队元素5
} catch(char *str){
cout<<str<<endl;
}
cout<<"当前队头元素为:"<<Q.GetHead()<<endl;//输出队头元素8
try{
cout<<"请输入入队元素:";
cin>>x;
Q.EnQueue(x);
} catch(char *str){
cout<<str<<endl;
}
if(Q.Empty()==1) cout<<"队列为空"<<endl;
else cout<<"队列非空"<<endl;//队列有2个元素,输出队列非空
return 0;
}
我是用C实现的,作者可以参考一下:
#include <stdio.h>
#include <stdlib.h>
// 定义链队的结构体
typedef struct queue_node {
int data; // 数据域
struct queue_node* next; // 指针域
} queue_node_t;
typedef struct {
queue_node_t* front; // 队头指针
queue_node_t* rear; // 队尾指针
} link_queue_t;
// 初始化链队
void init_queue(link_queue_t* q) {
// 队头和队尾都指向空节点
q->front = q->rear = (queue_node_t*)malloc(sizeof(queue_node_t));
if (!q->front) {
printf("Memory allocation failed.\n");
exit(1);
}
q->front->next = NULL;
}
// 判断队列是否为空
int is_empty(link_queue_t* q) {
return q->front == q->rear;
}
// 入队操作
void en_queue(link_queue_t* q, int x) {
queue_node_t* p = (queue_node_t*)malloc(sizeof(queue_node_t));
if (!p) {
printf("Memory allocation failed.\n");
exit(1);
}
p->data = x;
p->next = NULL;
q->rear->next = p; // 将新节点插入到队尾
q->rear = p; // 更新队尾指针
}
// 出队操作
int de_queue(link_queue_t* q) {
if (is_empty(q)) {
printf("Queue is empty.\n");
exit(1);
}
queue_node_t* p = q->front->next; // 记录队头节点
int x = p->data; // 获取队头节点的值
q->front->next = p->next; // 将队头节点出队
if (q->rear == p) {
q->rear = q->front; // 如果队列空了,需要更新队尾指针
}
free(p); // 释放队头节点的内存
return x; // 返回出队元素的值
}
// 主函数示例
int main() {
link_queue_t q;
init_queue(&q);
en_queue(&q, 1);
en_queue(&q, 2);
en_queue(&q, 3);
printf("%d\n", de_queue(&q));
printf("%d\n", de_queue(&q));
printf("%d\n", de_queue(&q));
printf("%d\n", de_queue(&q)); // 出队空队列,会输出"Queue is empty."
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!