数据结构:编写程序用队列实现打印杨辉三角

这篇具有很好参考价值的文章主要介绍了数据结构:编写程序用队列实现打印杨辉三角。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

          本文将通过完成用队列实现打印杨辉三角,代码解释标注全面而且清晰,代码书写也十分规范,适合初学者进行学习,本篇文章算是本人的一些学习记录分享,希望对有需要的小伙伴提供一些帮助~

希望能帮助大家掌握:

  1. 掌握定义顺序队和链队的结点类型的方法;
  2. 熟悉队列的入队和出队代表的实际意义;
  3. 掌握两种存储结构下队列的基本操作:入队、出队、输出队列等

一、链队列杨辉三角:

(1)链队列-杨辉三角
#include<iostream>
#include<fstream>
using namespace std;

#define OK 1
#define ERROR 
#define OVERFLOW -2
typedef int QElemType;
typedef int Status;
typedef int SElemType;

//- - - - - 队列的链式存储结构- - - - - 
typedef struct QNode {
	QElemType data;
	struct QNode *next;
} QNode, *QueuePtr;
typedef struct {
	QueuePtr front; //队头指针
	QueuePtr rear; //队尾指针
} LinkQueue;

//算法3.16 链队的初始化
LinkQueue InitQueue() {//构造一个空队列Q
	LinkQueue Q;
	Q.front = Q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点
	Q.front->next = NULL; //头结点的指针域置空
	return Q;
}

//算法3.17 链队的入队
LinkQueue InserQ(LinkQueue &Q, QElemType e) {//插入元素e为Q的新的队尾元素
	QueuePtr p;
	p = new QNode; //为入队元素分配结点空间,用指针p指向
	p->data = e; //将新结点数据域置为e
	p->next = NULL;
	Q.rear->next = p; //将新结点插入到队尾
	Q.rear = p; //修改队尾指针
	return Q;
}

//算法3.18 链队的出队
LinkQueue DeleteQ(LinkQueue &Q) {//删除Q的队头元素,用e返回其值 
	QueuePtr p;
	int e;
	//if (Q.front == Q.rear)
	//	return ERROR; //若队列空,则返回ERROR
	p = Q.front->next; //p指向队头元素
	e = p->data; //e保存队头元素的值
	Q.front->next = p->next; //修改头指针
	if (Q.rear == p)
		Q.rear = Q.front; //最后一个元素被删,队尾指针指向头结点
	delete p; //释放原队头元素的空间
	return Q;
}

//算法3.19 取链队的队头元素
SElemType GetHead(LinkQueue Q) {//返回Q的队头元素,不修改队头指针
	if (Q.front != Q.rear) //队列非空
		return Q.front->next->data; //返回队头元素的值,队头指针不变
}

int main()
{  LinkQueue Q;
   int i,n,x,j;
   printf("输入行数n:");
   scanf("%d",&n);     /* n为杨辉三角行数 */
   Q=InitQueue();	/*初始化队列*/
   Q=InserQ (Q, 1);         /* 第1行的1进队列 */
   for (i=2; i<=n; i++)     /* 打印第i-1行并生成第i行 */
   {  Q=InserQ (Q, 1);      /* 第i行中的第一个元素1进队 */
      for(j=1; j<i-1; j++)  /* 打印第i-1行的第j个*/
      {   printf("%d ",Q.front->next->data);    /* 输出队头 */
          x=GetHead (Q);  /*x获得队头的值*/
          Q=DeleteQ (Q);  /*删除队头元素-出队*/
          x=x+ Q.front->next->data;      /* 计算第i行的值 */
          Q=InserQ (Q, x);  /*x入队*/
      }
      printf("%d\n",Q.front->next->data); /* 打印第i-1行的最后一个1并换行 */
      Q=DeleteQ (Q);      /*删除队头元素-出队*/
      Q=InserQ (Q,1);       /* 第i行中的最后一个元素1进队 */
  }
  while (Q.front!=Q.rear)     /* 输出最后一行元素 */
  {   printf("%d ",Q.front->next->data); 
      Q=DeleteQ (Q);   /*删除队头元素-出队*/
  }
  return 0;
}

运行结果如下:

数据结构打印杨辉三角,C++,数据结构,数据结构,c++,算法

二、循环队列杨辉三角:

/***循环队列杨辉三角基本操作***/



#include<iostream>

#include<fstream>

using namespace std;



#define MAXQSIZE 100

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef char QElemType;

typedef int SElemType;

typedef int Status;



typedef struct {

QElemType *base;//初始化时动态分配存储空间

int front;//头指针

int rear;//尾指针

} SqQueue;



//算法3.11 循环队列的初始化

SqQueue InitQueue() {//构造一个空队列Q

SqQueue Q;

Q.base = new QElemType[MAXQSIZE]; //为队列分配一个最大容量为MAXSIZE的数组空间

if (!Q.base)

exit(OVERFLOW); //存储分配失败

Q.front = Q.rear = 0; //头指针和尾指针置为零,队列为空

return Q;

}



//算法3.12 求循环队列的长度

int QueueLength(SqQueue Q) {//返回Q的元素个数,即队列的长度

return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;

}



//算法3.13 循环队列的入队

SqQueue InserQ(SqQueue &Q, QElemType e) {//插入元素e为Q的新的队尾元素

//if ((Q.rear + 1) % MAXQSIZE == Q.front) //尾指针在循环意义上加1后等于头指针,表明队满

// return ERROR;

Q.base[Q.rear] = e; //新元素插入队尾

Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针加1

return Q;

}



//算法3.14 循环队列的出队

SqQueue DeleteQ(SqQueue &Q) {//删除Q的队头元素,用e返回其值

int e=0;

//if (Q.front == Q.rear)

// return ERROR; //队空

e = Q.base[Q.front]; //保存队头元素

Q.front = (Q.front + 1) % MAXQSIZE; //队头指针加1

return Q;

}



//算法3.15 取循环队列的队头元素

SElemType GetHead(SqQueue Q) {//返回Q的队头元素,不修改队头指针

if (Q.front != Q.rear) //队列非空

return Q.base[Q.front]; //返回队头元素的值,队头指针不变

}



int main()

{  SqQueue Q;

   int i,n,x,j;

   printf("输入行数n:");

   scanf("%d",&n);     /* n为杨辉三角行数 */

   Q=InitQueue(); /*初始化队列*/

   Q=InserQ (Q, 1);         /* 第1行的1进队列 */

   for (i=2; i<=n; i++)     /* 打印第i-1行并生成第i行 */

   {  Q=InserQ (Q, 1);      /* 第i行中的第一个元素1进队 */

      for(j=1; j<i-1; j++)  /* 打印第i-1行的第j个*/

      {   printf("%4d",Q.base[Q.front]);    /* 输出队头 */

          x=GetHead (Q);  /*x获得队头的值*/

          Q=DeleteQ (Q);  /*删除队头元素-出队*/

          x=x+ Q.base[Q.front];      /* 计算第i行的值 */

          Q=InserQ (Q, x);  /*x入队*/

      }

      printf("%4d\n",Q.base[Q.front]); /* 打印第i-1行的最后一个1并换行 */

      Q=DeleteQ (Q);      /*删除队头元素-出队*/

      Q=InserQ (Q,1);       /* 第i行中的最后一个元素1进队 */

  }

  while (Q.front!=Q.rear)     /* 输出最后一行元素 */

  {   printf("%4d",Q.base[Q.front]);

      Q=DeleteQ (Q);   /*删除队头元素-出队*/

  }

  return 0;

 运行结果如下:

数据结构打印杨辉三角,C++,数据结构,数据结构,c++,算法

        希望通过实现杨辉三角的打印能更好地掌握定义顺序队和链队的结点类型的方法,熟悉队列的入队和出队分别所代表的实际意义,对两种存储结构下队列的基本操作:入队、出队、输出队列等加深理解。

以上即是本文的全部内容,喜欢可以点赞收藏~文章来源地址https://www.toymoban.com/news/detail-735320.html

到了这里,关于数据结构:编写程序用队列实现打印杨辉三角的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——队列的实现

    队列 ,又称为伫列(queue),计算机科学中的一种抽象资料类型,是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。 这段代码使用 typedef 定义了一个

    2024年02月10日
    浏览(28)
  • 【数据结构—队列的实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、队列 1.1队列的概念及结构 二、队列的实现 2.1头文件的实现—Queue.h 2.2源文件的实现—Queue.c 2.3源文件的测试—test.c 三、测试队列实际数据的展示 3.1正常队列的出入 3.2入队列的同时存

    2024年02月04日
    浏览(32)
  • 数据结构—队列的实现

    前言:上次我们已经学习了数据结构中一个重要的线性表—栈,那么我们这一次就来学习另外一个重要的线性表—队列。 一、 队列的概念 二、 队列的实现: 1.队列的创建 三、 队列的操作 1.初始化队列 2.队尾入队列 3.队头出队列 4.获取队列头部元素 5.获取队列队尾元素 6.获

    2024年02月04日
    浏览(30)
  • 数据结构/队列实现栈

    在学习数据结构的过程当中,我们会学到栈和队列,在本篇文章中,重点讲解的是队列实现栈,在上篇文章中已经简单介绍过栈和队列的使用说明,以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客 关于一个队列的简单使用方式:    关于一个栈的

    2024年02月02日
    浏览(29)
  • 数据结构队列的实现

    本章介绍数据结构队列的内容,我们会从队列的定义以及使用和OJ题来了解队列,话不多说,我们来实现吧 队列 1。队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入

    2024年02月11日
    浏览(52)
  • 数据结构---队列的实现

    前言 一、什么是队列? 二、 队列接口的实现 1. 队列结构的定义 2. 接口实现 总结 队列是一种特殊的线性表。 特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。 进行插入操作的端称为

    2024年02月02日
    浏览(27)
  • 【数据结构与算法】用队列实现栈&&用栈实现队列&&设计循环队列

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、

    2024年01月20日
    浏览(32)
  • 【数据结构】 队列(Queue)与队列的模拟实现

    队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有==先进先出FIFO(FirstIn First Out) ==入队列: 进行插入操作的一端称为 队尾(Tail/Rear) 出队列: 进行删除操作的一端称为 队头(Head/Front) 在Java中, Queue是个接口,底层是通过链表实现

    2024年02月11日
    浏览(37)
  • 【数据结构】顺序队列模拟实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 一、队列的基本概念

    2024年02月10日
    浏览(30)
  • 数据结构——队列(C++实现)

    目录 队列的概念及结构  队列的实现 队列的代码实现 完整的源文件代码 总结 推荐题目巩固知识 队列:只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表,队列最重要的特性是 先进先出 (First In First Out) 入队列:进行插入操作的一端称为 队尾 出队列

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包