08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205
顺序队列各种基本运算算法的实现
顺序队列是较为普遍的一种队列实现方式,采用环状数组来存放队列元素,并用两个变量分别指向队列的前端(front)和尾端(rear),往队列中加进或取出元素时分别改变这两个变量的计数(count)。
队列中用环状数组存储数据(合理利用空间、减少操作),通过基本的append()将元素加入队列,serve()将元素移出队列,先进入的先移出,retieve得到最先加入队列的元素。此外在继承的Extended_queue()中我增加了empty()和serve_and_retrieve()的功能。
【实验说明】
我选择的题目:课本中Programming Projects 3.3 P1
问题描述:Write a function that will read one line of input from the terminal. The input is supposed to consist of two parts separated by a colon ':'. As its results, your function should produce a single character as follows:
N No colon on the line.
L The left part(before the colon) is longer than the right.
R The right part(after the colon) is longer than the left.
D The left and right parts have the same length but are different.
S The left and right are exactly the same.
Examples:
Use either a queue or an extended queue to keep track of the left part of the line while reading the right part.
1.分析队列要实现的基本功能以及继承的类要拓展的功能从而确定基本成员函数——append(),serve(),retireve(),拓展队列中:empty(),serve_and_retrieve(),确定队列中以环形数组存储数据从而确定成员函数——Queue_entry entry[],count(记录队列中数据数量)
2.编写队列的头文件及实现
3.分析题目中结束程序并输出几种字母的条件,简略画出功能实现的流程图,编写程序。(具体思路见源代码注释)
4.简单测试程序的几种情况,分析需要改进的地方
【相关代码】
queue.h
#ifndef QUEUE_H
#define QUEUE_H
const int maxqueue=10;
enum Error_code {success,overflow,underflow};
typedef char Queue_entry ;
class Queue{
public:
Queue();
bool empty() const;
Error_code append(const Queue_entry &item);
Error_code serve();
Error_code retrieve(Queue_entry &item)const;
protected:
int count;
int front,rear;
Queue_entry entry[maxqueue];
};
class Extended_queue:public Queue{
public:
bool full()const;
int size()const;
void clear();
Error_code serve_and_retrieve(Queue_entry &item);
};
#endif
queue.cpp
#include"queue.h"
Queue::Queue()
{
count=0;
rear=maxqueue-1;
front=0;
}
bool Queue::empty() const
{
return count==0;
}
Error_code Queue::append(const Queue_entry &item)
{
if(count>=maxqueue)return overflow;
count++;
rear=((rear+1)==maxqueue)?0:(rear+1);
entry[rear]=item;
return success;
}
Error_code Queue::serve()
{
if(count<=0)return underflow;
count--;
front=((front+1)==maxqueue)?0:(front+1);
return success;
}
Error_code Queue::retrieve(Queue_entry &item) const
{
if(count<=0)return underflow;
item=entry[front];
return success;
}
bool Extended_queue::full() const{
return count==maxqueue;
}
int Extended_queue::size()const{
return count;
}
void Extended_queue::clear(){
count=0;
rear=front;
}
Error_code Extended_queue::serve_and_retrieve(Queue_entry &item){
if(count==0)return underflow;
count--;
item=entry[front];
front=((front+1)==maxqueue)?0:(front+1);
return success;
}
【过程记录】
实验截图:
【结果分析】
1.实验中我以课本后面的练习题为例,实现并验证了顺序队列的更种功能。
2.队列与栈一样是在类中以数组存储数据,但由于队列先进先出的特点在实现存储形式上与栈有一定的不同。因为如果与栈一样对数据操作,队列会无限向后扩大,而前面取出过数据的地方将不会再被利用,十分浪费,也很容易溢出。所以我们采用循环数组来存储,这样合理利用了资源。但在类的实现要要极为时刻考虑周全rear和front的各种可能,要判断是不是循环到了前面,count在此时的功能也极为突出。
3.书中的程序看似简单,但实际判断各种输出情况的时候却极难考虑周全。我首先做出了简易的流程图,然后才写函数,具体分析及思路可见我源码的注释。另外本题还有另外一种实现思路:即将左右输入分别存放在两个队列中,边取去边比较,那样在逻辑上容易理解一些。但鉴于题目的要求,我还是用边从左边队列中取出边比较右边输入的方法。
4.我在实验中遇到的问题:
(1)自己一开始在循环判断用的是cin.get()=='\n'即遇到回车就停止输入,但却无法如料想中结束循环……最终采用cin>>a && waiting(用以标志‘:’的输入)来作为循环终止的条件,这样虽然可以运行,但用户必须输入Ctrl+‘Z’以结束输入。看来自己对输入流的理解与掌握还没有到位。
(2)另外在检验的时候,我发现输入‘:’之前是否输入回车情况是有区别的。如
输入“sam:sam”(无空格),结果为“R”
输入“sam : sam”(有空格),结构为“S”
显然后者是我希望得到的结果,我分析可能是前面情况‘:’被列入了right的判断,从而使结构右边比左边长。还没有想到如何改进。
分享到:
相关推荐
顺序队列是基于数组实现的数据结构,它的特点是操作主要集中在数组的两端:一端称为队头,用于出队;另一端称为队尾,用于入队。`queue_array.c` 和 `queue_array.h` 文件包含了顺序队列的实现。在C语言中,我们通常...
总之,顺序队列在数据结构中扮演着重要角色,特别是在需要处理线性序列数据的场景下,如任务调度、打印作业等。通过学习和实践,我们可以更好地理解和运用这种数据结构,提高算法设计和编程能力。
队列是一种重要的线性数据结构,它遵循先进先出(FIFO)的规则,即最先插入的元素将最先被移除。在计算机科学中,队列广泛应用于各种算法和程序设计中,尤其在处理需要顺序处理任务的场景下。在Java中,队列可以借助...
在计算机科学中,数据结构是组织、存储和处理数据的方式,它是算法的基础。Java作为一种广泛使用的编程语言,提供了丰富的库支持来实现各种数据结构。在这个主题中,我们将深入探讨Java中队列的实现,包括顺序队列...
与数组为基础的顺序队列不同,链队列不需要预先分配固定大小的空间,因此具有动态扩展的能力。在链队列中,元素不是存储在一个连续的内存块中,而是通过指针链接在一起。 链队列由两部分组成:队头(front)和队尾...
在Unity3D开发中,队列是一种非常实用的数据结构,它遵循先进先出(First In First Out, FIFO)的原则,即最先加入队列的元素会最先被移除。队列在游戏开发中有着广泛的应用场景,例如用于管理游戏对象的加载顺序、...
在本资源"商业编程-源码-数据结构(C语言版)顺序队列.zip"中,重点是C语言实现的顺序队列。下面将详细介绍顺序队列的概念、其在C语言中的实现以及它在商业编程中的应用。 顺序队列是一种线性数据结构,遵循“先进...
从提供的文件名列表(queue_3.cpp、queue_3.dsp、queue_3.dsw、queue_3.ncb、queue_3.opt、queue_3.plg)来看,这很可能是C++编写的一个关于顺序队列实现的项目。其中,queue_3.cpp很可能是主要的源代码文件,包含了...
在实现队列时,可以利用标准模板库(STL)中的`queue`容器,也可以自定义数据结构来实现。对于这个数据结构队列的作业,很可能是要求学生自定义一个队列类,以便更好地理解其内部工作原理。 自定义队列通常涉及以下...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便进行各种操作。在众多的数据结构中,队列是一种基本且至关重要的结构,它的行为类似于现实生活中的排队系统,遵循“先进先出”(FIFO)...
在计算机科学中,数据结构是组织、存储和处理数据的方式,而队列是其中一种基本且重要的数据结构。队列是一种线性数据结构,遵循“先进先出”(First In First Out, FIFO)的原则,类似于现实生活中的排队等待服务。...
在IT领域,C语言是一种广泛使用的编程语言,尤其在处理底层系统编程和数据结构时。本主题关注的是如何使用C语言来实现数据结构中的栈和队列,这是两种基础但非常重要的抽象数据类型(ADT)。 栈(Stack)是具有后进...
数据结构中的队列是一种线性数据结构,它遵循“先进先出”(FIFO, First In First Out)的原则。在本实验报告中,主要探讨了三种类型的队列:链队列、顺序队列和循环队列。 1. 链队列: 链队列是由一系列节点组成...
总的来说,C#中的队列数据结构是解决各种问题的强大工具,特别是在需要处理有序序列和执行顺序操作的场景下。通过理解和熟练运用这些数据结构,我们可以设计出更高效、更符合业务需求的解决方案。
顺序队列是一种线性数据结构,它按照元素在内存中的顺序进行存储,具有先进先出(FIFO,First In First Out)的特点。在本压缩包中,提供了C、C++和Java三种编程语言实现顺序队列的源码,这对于理解和学习不同语言的...
Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **...
### 数据结构C语言版_循环队列 #### 知识点概述 本篇文章将围绕“循环队列”这一数据结构进行详细的介绍与分析。在计算机科学领域,队列是一种非常重要的线性数据结构,它遵循先进先出(FIFO)的原则。而循环队列...
顺序队列是一种线性数据结构,它按照元素在内存中的存储方式来划分,所有元素在内存中连续存放,类似于数组。这种数据结构在处理大量数据时具有高效的特点,因为访问和操作元素通常只需要一个地址计算。本文将详细...
### 数据结构:队列实现详解 #### 一、队列概念与特性 在计算机科学领域,**队列**是一种常见的线性数据结构,遵循先进先出(First In First Out, FIFO)的原则。也就是说,最早添加到队列中的元素将是最先被移除的...
java语言实现的数据结构顺序队列,部分代码:public class OrderQueue { int rear=-1; int front=0; String[]queue; public OrderQueue(int initcap)throws Exception{ if(initcap){ throw new Exception(...