队列的应用、栈的应用
實驗一:隊列的應用、棧的應用
一. 實驗目的
1、掌握隊列的特點(先進先出 FIFO)及基本操作,如入隊、出隊等。
2、利用循環隊列的特點解決實際問題,提高編程能力。
3、掌握棧的特點(先進后出 FILO)及基本操作,如入棧、出棧等。
4、利用棧的特點解決實際問題,提高編程能力。
二. 實驗內容
1、編寫一個程序實現循環隊列的各種基本運算,并在此基礎上設計一個主程序,完成如下功能:
(1)初始化循環隊列;
(2)給定一個元素,將此元素插入此隊列中;
(3)將隊頭一個元素出隊。
2、編程實現順序棧的各種基本運算,并在此基礎上設計一個主程序,完成如下功能:
(1)初始化順序棧;
(2)給定一個元素,將此元素壓入此棧中;
(3)將棧頂一個元素彈出此棧。
三. 數據結構及算法設計描述
循環隊列和棧都是線性結構,是邏輯結構的一種。而存儲結構是數據在計算機中的表示,循環隊列在計算機內是順序存儲結構,棧在計算機內可是以順序也可以是鏈式。所以循環隊列和棧都是線性邏輯結構,不能說循環隊列和棧是存儲結構,只能說它們在計算機內的存儲結構。
1:順序隊列
采用順序存儲結構的隊列稱為順序隊列,要用一片連續的空間來存儲隊列的元素。
1.1 順序隊列中各元素的邏輯及存儲關系
順序隊列可以采用順序表作為其存儲表示,因此,可以在順序隊列的聲明中用順序表定義它的存儲空間。
順序隊列可以使用一維數組作為隊列的存儲空間,存放隊列元素的數組的頭指針為*elements,該數組的最大允許存放元素個數為maxSize,當前隊列的隊頭位置由數組下標指針front指示,隊尾位置由數組下標指針rear指示,如果隊列不為空時elements[0]是隊列中第一個元素。
1.2 代碼實現
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; //----- 隊列的順序存儲表示 ----- #define MAXQSIZE 30 // 存儲空間的初始分配量 typedef struct {ElemType *base;int front;int rear;int maxSize; } SqQueue;// 構造一個空隊列 Q Status InitQueue(SqQueue &Q) {Q.base = (ElemType*)malloc(MAXQSIZE * sizeof(ElemType));if(!Q.base) exit(OVERFLOW);Q.front = Q.rear=0;Q.maxSize = MAXQSIZE;return OK; } //判隊列是否為空Status QueueEmpty(SqQueue Q) {if(Q.rear==Q.front) return TRUE;else return FALSE; }//入隊函數 Status EnQueue(SqQueue &Q, ElemType e) { //請在此填寫代碼,將該算法補充完整,參見書本和課件相關章節if((Q.rear+1) % MAXQSIZE == Q.front)//隊列已滿return ERROR;Q.base[Q.rear] = e;//插入隊尾Q.rear = (Q.rear +1) % MAXQSIZE;//尾部指針后移,如果到最后則轉到頭部return OK; }//出隊函數 Status DeQueue(SqQueue &Q, ElemType &e) {//請在此填寫代碼,將該算法補充完整,參見書本和課件相關章節if(Q.front == Q.rear) //隊列空return ERROR;//返回隊頭元素e = Q.base[Q.front]; //隊頭指針后移,如到最后轉到頭部Q.front = (Q.front + 1) % MAXQSIZE; return OK; }//輸出循環隊列函數 void OutQueue(SqQueue Q) { ElemType e;if(QueueEmpty(Q)){printf("這是一個空隊列!");} else {while(!QueueEmpty(Q)){DeQueue(Q,e);printf("%6d", e);}printf("\n");} }//主函數 int main() { SqQueue q;int cord; ElemType a;printf("第一次使用必須初始化!\n");//調用初始化算法InitQueue(q); do{printf("\n 主菜單 \n");printf(" 1 初始化循環隊列 ");printf(" 2 進隊一個元素 ");printf(" 3 出隊一個元素 ");printf(" 4 結束程序運行 ");printf("\n------------------------------------------------------------------\n");printf("請輸入您的選擇( 1, 2, 3, 4)");scanf("%d", &cord);printf("\n");switch(cord) {case 1:InitQueue(q); //調用初始化算法;OutQueue(q);break;case 2:printf("請輸入要插入的數據元素:a=");scanf("%d",&a);EnQueue (q, a); //調用進隊算法;printf("%d 進隊之后的隊列:",a);OutQueue(q);break;case 3:DeQueue (q, a); //調用出隊算法;printf("隊頭元素 %d 出隊之后的隊列:",a);OutQueue(q);break;case 4:exit(0);}} while(cord<=4);return 0; }2:順序棧
采用順序存儲的棧成為順序棧,需要用一片連續的空間來存儲棧的元素。
2.1 代碼實現
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 typedef int ElemType; typedef int Status; //----- 棧的順序存儲表示 ----- #define STACK_INIT_SIZE 10 // 存儲空間的初始分配量 #define STACKINCREMENT 5// 存儲空間的分配增量typedef struct{ElemType *base; //存儲空間的基址int top; //棧頂元素的下一個元素,簡稱棧頂位標int size; //當前分配的存儲容量,作用看入棧操作就可以知道int increment; //擴容時,增加的存儲容量,作用看入棧操作就可以知道 } SqStack; //順序棧名稱// 構造一個空棧 S Status InitStack(SqStack &S) {S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!S.base) exit(OVERFLOW);S.top = 0;S.size = STACK_INIT_SIZE;S.increment = STACKINCREMENT;return OK; }// 判棧 S 是否為空棧 Status StackEmpty(SqStack S){if(S.top==0)return TRUE;else return FALSE; }//入棧函數 Status Push(SqStack &S, ElemType e) {//定義中間變量ElemType *newbase; //S.top如果指向最后一個不存儲元素的地址時,即S.top大于if (S.top>= S.size) { //等于S.size時,就表示棧滿了 //通過realloc動態擴容newbase = (ElemType*)realloc(S.base,(S.size + S.increment) * sizeof(ElemType));//判斷擴容是否成功 if (NULL == newbase) return OVERFLOW; //擴容成功后才將中間變量的值指向S.elem,防止擴容失敗時,S.base = newbase;//S.elem指向一個不是原來的位置 S.size += S.increment; }//將e元素入棧; 使S.top加1,表示指向的是棧頂位標S.base[S.top++] = e;//上面操作正常后返回1 return OK; }//出棧函數; 棧頂元素出棧,賦給元素e Status Pop(SqStack &S, ElemType &e) { //請在此填寫代碼,將該算法補充完整,參見課本和課件相關章節if ( 0 == S.top) return ERROR; //e出棧,并將S.top減1e = S.base[--S.top]; return OK; }//輸出順序棧函數 void OutStack(SqStack S) { ElemType e;if(TRUE == StackEmpty(S)) {printf("這是一個空棧!");} else while(FALSE == StackEmpty(S)){Pop(S, e);printf("%6d", e);}printf("\n"); } //主函數 int main() { SqStack s;int cord; ElemType a;printf("第一次使用必須初始化!\n");do {printf("\n 主菜單 \n");printf(" 1 初始化順序棧 ");printf(" 2 插入一個元素 ");printf(" 3 刪除棧頂元素 ");printf(" 4 結束程序運行 ");printf("\n-------------------------------------------------------------------\n");printf("請輸入您的選擇( 1, 2, 3, 4)");scanf("%d",&cord);printf("\n");switch(cord) { case 1:InitStack(s);OutStack(s);break;case 2:printf("請輸入要插入的數據元素:a=");scanf("%d",&a);Push(s, a);printf("%d 進棧之后的棧:",a);OutStack(s);break;case 3:Pop(s, a);printf("棧頂元素 %d 出棧之后的棧:",a);OutStack(s);break;case 4:exit(0);}} while (cord <= 4);return 0; }四. 實驗結果及分析
4.1 順序隊列
4.1.1 運行截圖
4.1.2時間復雜度
4.2 順序棧
4.2.1 運行截圖
4.2.2時間復雜度
五. 總結(心得與體會)
(內容,中文宋小四,英文羅馬)
說明:此部分對本次實驗收獲及疑惑進行總結。
體會多則多寫,少則少寫,沒有則不寫,切勿搬抄他人!
總結
以上是生活随笔為你收集整理的队列的应用、栈的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java上机操作练习题-助力期末
- 下一篇: 利用队列实现车厢编组