データ構造エッセイ - 2つのキューの種類、およびSTL <キュー>

私たちは、オペレーティングシステムの疑いがあるクラッシュが発生しただけでも、何の効果をマウスのポインタを合わせませんが、しばらくした後、そのようなデータキューの使用に、その過程で、あなたのマウス操作を再び実行している置くだろう構造をソートします。

队列( queue )是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。

まず、チェーンキュー

キューリストの一種と同様鎖キュー、キュー長の鎖のためのスペースが固定されていない、記憶されたキューの順序よりもサイクル、より多くのポインタフィールドのみ。

定義

二つの構造を定義する必要は、1つのノードが頭と尾のポインタであります

typedef int datatype;
typedef struct queue_node
{
	datatype data;
	queue_node* next; //下一个结点(结构体指针)
}node,*queueptr; //节点结构的指针
struct linked_queue //链式队列的结构
{
	queueptr front, rear;
};

キューの初期化

キューを初期化する、それだけでは挿入ノード上にアプリケーションへと、キュー構造に初期化する必要があります。

int initqueue(linked_queue &q) //初始化链式队列结构,引用传递
{
	q.front = q.rear = (queueptr)(malloc(sizeof(node)));
	if (!q.front)
	{
		cout << "初始化失败" << endl;
		return 0;
	}
	q.front->next = NULL; //此处一定要置空
	cout << q.front->next << endl;
	return 1;
}

挿入

注目ポイント価値が次に割り当てられたヘッドノードの最初の要素をアドレス指定する方法は?
まず、初期化中に、頭と尾フロント、リアが等しい場合、使用rear.next =(ノードアドレス)を割り当て、次のことができ解決しました。

int insert_queue(linked_queue &q, datatype x)//将x插入队列
{
	queueptr s = (queueptr)malloc(sizeof(node));
	if (!s)
	{
		cout << "申请失败" << endl;
		return 0;
	}
	else
	{
		s->data = x;
		s->next = NULL; //生成新的结点
		q.rear->next = s; 
		//插入尾部,刚开始第一步时,因为头尾指针相同,所以头指针被赋予了第一个元素的地址
		q.rear = s; //修改队尾指针
		return 1;
	}
}

ポップアップ要素

ポップアップは、キューが空であるかどうかを判断する必要がある場合は?それはポップの最初の要素であるかどうか?最初の要素は、ポップアップヘッドとテールポインタが等しい再びあるようにする必要がある場合。

int pop_queue(linked_queue &q, datatype& e)//用e返回其值
{
	queueptr p;
	if (q.front == q.rear)
	{
		cout << "队列为空" << endl;
		return 0;
	}
	p = q.front->next; //暂存头元素指针
	e = p->data; 
	q.front = p->next;
	if (q.rear = p) //若队头是队尾,删除后队尾指向队头
		q.rear = q.front;
	free(p);
	return 1;
}

ディスプレイ、計算とリンクリストのキュー内の要素の数が同じのためとして。

第二に、巡回キュー

まず、問題に見てみましょう、我々は添字の位置0を指すようにアレイ5、キューの初期状態は空で、フロントとリアのポインタの長さを想定しています。次いでエンキューA1、A2、A3、A4、フロントポインタはまだ場所に0と指定次の位置、リア4点を指します。

デキューA1、A2、その後、フロントポインタが指す位置には、図2に示すように、リア不変の再突入チームA5、この時定数ポインタフロント、アレイの外側に後方ポインタが移動標識。この時点では、位置0,1またはスペア、虚偽のオーバーフローと呼ばれる現象であることができます。

この問題を解決するには、背面にあるので、いっぱいあり、その後、ゼロからスタート。我们把队列的这种头尾相接的顺序存储结构称为循环队列。

コードを書くとき、私たちは以下の質問を考慮する必要があります。

キューがある場合は、それを空に?明らかに、ときに、2つが等しいとき防ぐために知っていない==リア、フロントが空またはいっぱいです。キューがいっぱいになったときに我々は、スペアユニットの配列があり、ルールを変更します。

フルキュー:私たちは、キュー満杯状態であることを、キューの最大ビットQUEUESIZEの最大サイズを定義します(rear+1)%queuesize==front

キューの長さ:ときリア<場合フロント、リアフロント+のQUEUESIZEの長さが、リア>場合、フロント、リアフロントの長さ、一般式ので (rear-front+queuesize)%queuesize

定義と基本的な操作

typedef int datatype;
#define maxsize 1024
typedef struct circular_queue
{
	datatype data[maxsize];
	int front;
	int rear;
}queue;
int initqueue(queue *q) //初始化
{
	q->front = q->rear = 0;
	return 1;
}
int length(queue* q) //求长度
{
	return (q->rear - q->front + maxsize) % maxsize;
}

挿入

int insert_queue(queue* q, datatype e)
{
	if ((q->rear + 1) % maxsize == q->front)
	{
		cout << "循环队列为满" << endl;
		return 0;
	}
	q->data[q->rear] = e;
	q->rear = (q->rear + 1) % maxsize;
	return 1;
}

[削除]

int pop_queue(queue* q, datatype* x)//弹出元素放到地址x中
{
	if (q->front == q->rear)
	{
		cout << "循环队列为空" << endl;
		return 0;
	}
	*x = q->data[q->front];
	q->front = (q->front + 1) % maxsize;
	return 1;
}

すべての要素

int show_queue(queue* q)
{
	if (q->front == q->rear)
	{
		cout << "循环队列为空" << endl;
		return 0;
	}
	int i = q->front;
	while ( i% maxsize != q->rear) //从头到尾
	{
		cout << q->data[i] << endl;
		i++;
	}
}

三、STL中的queue

最初は、ホイールが終了したすべての後の動作は、非常に単純ですが、基本的なキューです。

#include<queue>//头文件
queue<typename>name;
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数

プライオリティキューの基本的な操作

プライオリティキューでは、要素が優先されます。要素にアクセスする場合、最も高い優先順位を持つ要素を削除することが最初です。機能や動作と同様に。

定義:priority_queue<Type, Container, Functional>

タイプはデータ・タイプである、容器のタイプは、コンテナ(コンテナ容器のアレイは、このようなベクター、両端キューなど、実装されなければならないが、デフォルトはlist.STLベクター内で使用されて使用できない)であり、機能的な実施形態の比較です。のみ使用する必要があるカスタムデータ型は、基本データ型、のみ着信データ型を使用して、これらの3つのパラメータを渡す必要がある場合は、デフォルトではトップの大きなヒープです。PRIORITY_QUEUE <>支援容器は容器のアレイ内に実装されなければなりません

 priority_queue<int> a; 
//等同于 priority_queue<int, vector<int>, less<int> > a;
priority_queue<int, vector<int>, greater<int> > b;  
//这样就是小顶堆
堆:通俗来讲利用完全二叉树的结构来维护的一维数组

おすすめ

転載: www.cnblogs.com/lonely-ok/p/12656775.html