数据结构(C++版)——7-1 队列的实现及基本操作(链栈实现,无上限)

简介: 数据结构(C++版)——7-1 队列的实现及基本操作(链栈实现,无上限)

PTA数据结构(C++版)——7-1 队列的实现及基本操作(链栈实现,无上限)

1.编译运行

20201121191609979.gif

2.题目:

给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。

  • 输入格式:

输入第1行为1个正整数n,表示操作个数;接下来n行,每行表示一个操作,格式为1 d或0。1 d表示将整数d入队,0表示出队。n不超过20000。

  • 输出格式:

按顺序输出每次出队的元素,每个元素一行。若某出队操作不合法(如在队列空时出队),则对该操作输出invalid。

  • 输入样例:

在这里给出一组输入。例如:

7

1 1

1 2

0

0

0

1 3

0

  • 输出样例:

1

2

invalid

3

3.代码块

考虑到动态,所以选择链式存储结构,链队

  • 队列的链式存储结构
typedefstructQNode{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct {
QueuePtrfront; //队头指针 QueuePtrrear;  //队尾指针 }LinkQueue;
  • 链队的初始化
StatusInitQueue(LinkQueue&Q){
//生成新结点作为头结点,队头和队尾指针指向此结点 Q.front=Q.rear=newQNode;
//头结点的指针域为空 Q.front->next=NULL;
returnOk;
}
  • 链队的入队
StatusEnQueue(LinkQueue&Q,QElemTypee){
//插入元素e为Q的新的队尾元素//为入队元素分配结点空间,用指针P指向 QNode*p=newQNode;
//新结点的数据域为e p->data=e;
//将新结点插入到队尾 p->next=NULL;
//修改队尾指针 Q.rear->next=p;
Q.rear=p;
returnOk;
}
  • 链队的出队
StatusDeQueue(LinkQueue&Q,QElemType&e){
//删除Q的队头元素,用e返回其值//若队列为空,则返回Error if(Q.front==Q.rear) returnError;
//p指向队头元素 QNode*p=Q.front->next;
//e保存队头元素的值 e=p->data;
//修改头结点的指针域 Q.front->next=p->next;
//最后一个元素被删,队尾指针指向头结点 if(Q.rear==p) Q.rear=Q.front;
//释放原队头元素的空间 deletep;
returnOk; 
} 
  • 取链队的头元素
SElemTypeGetHead(LinkQueueQ){
//返回Q的队头元素,不修改指针//队列非空 if(Q.front!=Q.rear){
//返回队头元素的值,队头指针不变 returnQ.front->next->data;
    } 
}

4.源码

#include<iostream>usingnamespacestd;
typedefintQElemType;
typedefintSElemType;
typedefintStatus;
#defineOk1#defineError0//队列的链式存储结构 typedefstructQNode{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct {
QueuePtrfront; //队头指针 QueuePtrrear;  //队尾指针 }LinkQueue;
//链队的初始化 StatusInitQueue(LinkQueue&Q){
//生成新结点作为头结点,队头和队尾指针指向此结点 Q.front=Q.rear=newQNode;
//头结点的指针域为空 Q.front->next=NULL;
returnOk;
}
//链队的入队StatusEnQueue(LinkQueue&Q,QElemTypee){
//插入元素e为Q的新的队尾元素//为入队元素分配结点空间,用指针P指向 QNode*p=newQNode;
//新结点的数据域为e p->data=e;
//将新结点插入到队尾 p->next=NULL;
//修改队尾指针 Q.rear->next=p;
Q.rear=p;
returnOk;
} 
//链队的出队StatusDeQueue(LinkQueue&Q,QElemType&e){
//删除Q的队头元素,用e返回其值//若队列为空,则返回Error if(Q.front==Q.rear) returnError;
//p指向队头元素 QNode*p=Q.front->next;
//e保存队头元素的值 e=p->data;
//修改头结点的指针域 Q.front->next=p->next;
//最后一个元素被删,队尾指针指向头结点 if(Q.rear==p) Q.rear=Q.front;
//释放原队头元素的空间 deletep;
returnOk; 
} 
//取链队的头元素SElemTypeGetHead(LinkQueueQ){
//返回Q的队头元素,不修改指针//队列非空 if(Q.front!=Q.rear){
//返回队头元素的值,队头指针不变 returnQ.front->next->data;
    } 
} 
intmain(){
QElemTypee;
LinkQueueQ; 
InitQueue(Q);
intn,b;
cin>>n;
while(n-->0){
cin>>b;
if(b==1){
cin>>b;
EnQueue(Q,b);
        }
if(b==0){
if(Q.front==Q.rear)
cout<<"invalid"<<endl;
else{
DeQueue(Q,b);
cout<<b<<endl;
            }           
        }           
    }
return0;
 } 


目录
相关文章
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
247 9
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
74 5
|
2月前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
82 7
|
2月前
|
消息中间件 存储 安全
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
42 0
|
3月前
初步认识栈和队列
初步认识栈和队列
66 10
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
31 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
21 0
|
3月前
探索数据结构:队列的的实现与应用
探索数据结构:队列的的实现与应用