(1) 実験の目的
この実験を通じて、学生はチェーン キューの構造的特徴を理解し、それを柔軟に適用することができ、チェーン キューの基本操作のプログラミング実装を習得し、スタックが一方の端で挿入、他方の端で削除される線形構造であることを理解します。キューの「先着順」の「Out」操作特性を習得し、キューが空か満杯かを判断する条件を知り、C 言語でのポインタ操作にさらに慣れます。
(2) 実験内容
チェーンストレージ構造を使用して、教科書で定義されているキューの基本的な動作を実現します。
(3) リファレンスインターフェース
メニューには次の機能が含まれています。
1. キューを初期化する、2. キューを破棄する、3. キューを空にする、4. キューを空にする、5. キューの長さを調べる、6. キューの先頭要素を取得する、7. 要素を挿入する、8 . 要素を削除します。 9 すべての要素を出力します。
要件: プロンプトと出力ステートメントはカスタム関数では許可されません。
(4) 受入・テストケース
メニューから各操作を呼び出し、ポイントをテストします。
- 初期化の前に他の操作が実行されるかどうか、プログラムがそれを制御できるかどうか。
- キューを初期化します。
- キューが空であると判断すると、画面にはキューが空であることが表示されます。
- チームには 3 つの数字、3、5、7。
- キューヘッドの長さ、画面出力 3。
- キューのヘッド要素を取得し、キューが空かどうかを判断し、キューの長さを判断します (キューのヘッド要素を取得してもキューの内容は変更されず、キューのヘッド ポインタも変更されないことを生徒に理解してもらいます)。
- キューを終了し、キューの長さを判断し、キュー内の残りの要素を表示します (キューを複数回終了し、キューが空になった後で終了操作を実行します。キューが空であることを示すプロンプトを表示するかどうか)。
- 要素 2 をエンキューし、デキューして、キューが空かどうかを判断します (主に、デキュー操作の特殊な場合の 2 行のコードが書き込まれているかどうかをテストします)。
- チームを破壊し、他の操作を行ってプログラムを制御できるかどうかを確認します。
以下は私が書いたソースコードです。
#include<iostream>
using namespace std;
#define MAXQSIZE 100
#define OK 1
#define error -1
#define false 0
#define overflow -2
#define maxsize 20
#define STACKINCREMENT 10
typedef int Status;
typedef int QElemType;
typedef struct QNode {
QElemType data;
struct QNode* next;
}QNode, * QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue& Q) {
Q.front = Q.rear = new QNode;
if (!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status QueueEmpty(LinkQueue& Q) {
if (Q.front == Q.rear)
return OK;
else
return error;
}
Status DestoryQueue(LinkQueue& Q) {
if (Q.front == Q.rear)return error;
while (Q.front)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
Status EnQueue(LinkQueue& Q, QElemType e) {
QueuePtr p;
p = new QNode;
if (!p)
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
if (Q.front == Q.rear)return error;
return OK;
}
Status GetHead(LinkQueue Q,QElemType &e) {
if (Q.front == Q.rear)return error;
return Q.front->next->data;
}
Status Length(LinkQueue& Q,QElemType &e) {
if (Q.front == Q.rear)return error;
e = 0;
QueuePtr p = Q.front;
while (p != Q.rear) {
e++;
p = p->next;
}
return e;
}
Status DeQueue(LinkQueue& Q,QElemType &e) {
if (Q.front == Q.rear)return error;
QNode* p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)Q.rear = Q.front;
delete p;
return OK;
}
int main() {
int m, e, i, j, n;
LinkQueue Q;
cout << "1.初始化链队列" << endl;
cout << "2.判断链队列是否为空" << endl;
cout << "3.销毁链队列" << endl;
cout << "4.入队" << endl;
cout << "5.求队头元素" << endl;
cout << "6.求队长" << endl;
cout << "7.出队" << endl;
do {
cout << "请输入你的选择:" << endl;
cin >> n;
switch (n)
{
case 1:
m = InitQueue(Q);
if (m == overflow)
{
cout << "队列初始化失败!" << endl;
}
if (m == OK)
{
cout << "队列初始化成功!" << endl;
}
break;
case 2:
m = QueueEmpty(Q);
if (m == error)
{
cout << "队列不为空!" << endl;
}
else if (m == OK)
{
cout << "队列为空!" << endl;
}
break;
case 3:
m = DestoryQueue(Q);
if (m == error)
{
cout << "请先初始化队列!" << endl;
}
else if (m == OK)
{
cout << "队列销毁成功" << endl;
}
break;
case 4:
cout << "请输入你要入队的元素:" << endl;
cin >> e;
m = EnQueue(Q,e);
if (m == error)
{
cout << "请先初始化队列!" << endl;
}
else {
cout << "入队成功!" << endl;
}
break;
case 5:
m = GetHead(Q, e);
if (m == error) {
cout << "请先初始化栈!" << endl;
}
else {
cout << "队头元素是:" << e << endl;
}
break;
case 6:
m = Length(Q,e);
if (m == error) {
cout << "请先初始化队列!" << endl;
}
else {
cout << "队长为:" << e<<endl;
}
break;
case 7:
m = DeQueue(Q, e);
if (m == error) {
cout << "请先初始化栈!" << endl;
}
else {
cout << "出队成功" << endl;
}
break;
}
} while (n > 0);
}
データ構造を学習している初心者なので、書かれたコードは十分に完璧ではないかもしれません。軽くスプレーしていただければ幸いです。(ボールボール)