编程实现链队的入队、出队操作。(需要详细过程)

【问题描述】
求解答编程实现链队的入队、出队操作。(需要详细过程。)

链表实现的队列吗?之前给你写过一个啊,那个有什么问题吗?还是说不需要循环链表了?
下面是一个链式队列的代码,运行结果如下(截图不全,入队元素是10、9、8,10和9的入队没截上图):

img

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;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632