隊列-數據結構

隊列也是一種運算受限的線性表。是一種先進先出的線性表,只容許在表的一端插入,在另外一端進行刪除。
容許刪除的一段稱爲隊首,容許插入的一端成文隊尾。ui

隊列根據存儲形式可分爲:順序隊列,鏈式隊列。區別爲物理存儲是否連續,相應的節點之間的聯繫爲是否須要做用域。指針

應用隊列打印楊輝三角:
循環隊列中一次存放i-1行上的元素,而後逐個出隊並打印,同時生成第i行元素併入隊列。code

#include "stdio.h"
#define  TRUE 1
#define  FALSE 0
#define MAXSIZE 50  /*隊列的最大長度*/

typedef struct
{
	int element[MAXSIZE];  /* 隊列的元素空間*/
	int front;  /*頭指針指示器*/
	int rear;  /*尾指針指示器*/
}SeqQueue;


/*初始化操做*/
void InitQueue(SeqQueue *Q)
{  
	/* 將*Q初始化爲一個空的循環隊列 */
	Q->front=Q->rear=0;
}

int IsEmpty(SeqQueue *Q)
{
	if(Q->front==Q->rear)  //隊列爲空
		return(TRUE);
	else return FALSE;

}

/*入隊操做*/
int EnterQueue(SeqQueue *Q, int x)
{  
	/*將元素x入隊*/
	if((Q->rear+1)%MAXSIZE==Q->front)  /*隊列已經滿了*/
		return(FALSE);
	Q->element[Q->rear]=x;
	Q->rear=(Q->rear+1)%MAXSIZE;  /* 從新設置隊尾指針 */
	return(TRUE);  /*操做成功*/
}

/*出隊操做*/
int DeleteQueue(SeqQueue *Q, int *x)
{ 
	/*刪除隊列的隊頭元素,用x返回其值*/
	if(Q->front==Q->rear)  /*隊列爲空*/
		return(FALSE);
	*x=Q->element[Q->front];
	Q->front=(Q->front+1)%MAXSIZE;  /*從新設置隊頭指針*/
	return(TRUE);  /*操做成功*/
}

int GetHead(SeqQueue *Q, int *x)
{ 
	/*提取隊列的隊頭元素,用x返回其值*/
	if(Q->front==Q->rear)  /*隊列爲空*/
		return(FALSE);
	*x=Q->element[Q->front];
	return(TRUE);  /*操做成功*/
}

void YangHuiTriangle( )
{ 
	int n;
	int i;
	int temp;
	int x;
	int N;
	SeqQueue Q;
	InitQueue(&Q);
	EnterQueue(&Q,1);  /* 第一行元素入隊*/
	printf("please input N:");
	scanf("%d",&N);
	for(n=2;n<=N;n++)   /* 產生第n行元素併入隊,同時打印第n-1行的元素*/
	{
		EnterQueue(&Q,1);   /* 第n行的第一個元素入隊*/
		for(i=1;i<=n-2;i++)  /* 利用隊中第n-1行元素產生第n行的中間n-2個元素併入隊*/
		{
			DeleteQueue(&Q,&temp);
			printf("%6d",temp);     /* 打印第n-1行的元素*/
			GetHead(&Q,&x);
			temp=temp+x;      /*利用隊中第n-1行元素產生第n行元素*/
			EnterQueue(&Q,temp);  
		}
		DeleteQueue (&Q,&x);  
		printf("%6d",x);    /* 打印第n-1行的最後一個元素*/
		EnterQueue(&Q,1);   /* 第n行的最後一個元素入隊*/
		printf("\n");
	}
  while(!IsEmpty(&Q))        //打印第n行元素
 { DeleteQueue(&Q,&x);         
   printf("%6d",x); }

}

void main()
{
	YangHuiTriangle( );
}
相關文章
相關標籤/搜索