私たちは、オペレーティングシステムの疑いがあるクラッシュが発生しただけでも、何の効果をマウスのポインタを合わせませんが、しばらくした後、そのようなデータキューの使用に、その過程で、あなたのマウス操作を再び実行している置くだろう構造をソートします。
队列( 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;
//这样就是小顶堆
堆:通俗来讲利用完全二叉树的结构来维护的一维数组