<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
題幹要求:
細節分析:佇列是先進先出; 要實現的棧是先進後出。
解題思路:假設:先用一個佇列儲存資料 N 個,然後將前 N-1 個資料匯入到另一個佇列,
此時,原始佇列中僅剩一個,是最後剩的資料,便可將其匯出,這便是一次後進先出。
細節點:每次匯出資料時,都需要一個佇列向另一個佇列傳入資料,因此輸入佇列和輸出佇列 需要輪換,要對其進行判定。
具體過程gif動態圖如下:
1.初始化棧:先初始化兩個佇列
//棧的結構是由兩個佇列構成 typedef struct Nystack{ Quetail q1; Quetail q2; } MyStack; //棧的初始化 MyStack* myStackCreate() { MyStack* Newstack = (MyStack*)malloc(sizeof(MyStack)); Que_Init(&Newstack->q1); Que_Init(&Newstack->q2); return Newstack; }
2. 插入資料
因為儲存資料的佇列不是固定的,因此在一個佇列有資料的前提下,就繼續向該佇列插入資料,
空的佇列負責在匯出資料時進行輪轉。(哪個不空向哪個插入)
//插入資料 void myStackPush(MyStack* obj, int x) { //if((&obj->q1)->head == NULL) //法一:直接判斷是否為空 if(Que_Empty(&obj->q1)) //法二:後續函數的複用 Que_push(&obj->q2,x); else Que_push(&obj->q1,x); }
3.匯出資料(實現先進後出)
第一步:將有資料的佇列中除最後進的資料,依次匯入到另一個空佇列 ;
匯入空佇列,刪除原佇列,保留最後資料。
第二布:將原佇列中最後一個資料匯出 。
注:這裡先假設了兩個佇列中,一個是原佇列和一個是空佇列,再進行判定,若與實際不符,則 交換 。
int myStackPop(MyStack* obj) { int temp = 0; //假設原佇列和空佇列 Quetail* existque = &obj->q1,*nullque = &obj->q2; if((&obj->q1)->head == NULL) //判斷與實際是否相符 { existque = nullque; nullque = &obj->q1; } for(;existque->head->Next;) //保留最後一個資料 { Que_push(nullque,existque->head->data); //向空佇列匯入資料 Que_pop(existque); //刪除原佇列資料 } temp = existque->head->data; Que_pop(existque); //匯出最後進的資料 return temp; }
4.查詢棧頂資料
找到不空的佇列 >> 返回其隊尾的資料
int myStackTop(MyStack* obj) { if((&obj->q1)->head == NULL) { return (&obj->q2)->tail->data; } return (&obj->q1)->tail->data; }
5.判斷棧是否為空:
判斷兩個佇列是否均為空
bool myStackEmpty(MyStack* obj) { assert(obj); //法一:直接判斷 //if((&obj->q1)->head == NULL&& (&obj->q2)->head == NULL) //法二:複用佇列判空函數 if(Que_Empty(&(obj->q1))&&Que_Empty(&(obj->q2))) return true; return false; }
6.銷燬棧:
銷燬兩個佇列
void myStackFree(MyStack* obj) { Que_Destory(&obj->q1); Que_Destory(&obj->q2); free(obj); }
題幹要求:
細節分析:這次是用兩個棧,實現先進先出 。
解題思路:首先,將兩個棧分為入口棧和出口棧,
其次,資料正序入口棧,由於棧是先進後出,因此將資料再逆序進入出口棧,
然後,此時資料再出口棧中是逆序,所以,便可以正序從出口棧中依次排出 。
1.初始化雙棧佇列
typedef struct { Stack T1; Stack T2; } MyQueue; MyQueue* myQueueCreate() { MyQueue *Q1; Q1 = (MyQueue*)malloc(sizeof(MyQueue)); Stack_init(&(Q1->T1)); // T1 做入口棧 Stack_init(&(Q1->T2)); // T2 做出口棧 return Q1; }
2.插入資料
void myQueuePush(MyQueue* obj, int x) { Stack_push(&obj->T1,x); //這裡將棧 T1 作為入口棧 }
3.刪除資料(先進先出)
將入口棧資料記錄 >> 刪除入口棧資料 >> 匯入出口棧 >> 從出口棧匯出資料
int myQueuePop(MyQueue* obj) { if(Stack_Empty(&obj->T2)) //判斷是否為空 { int k = 0; for(;!Stack_Empty(&obj->T1);) { k = Stack_Top(&obj->T1); //記錄入口站資料 Stack_pop(&obj->T1); //刪除入口棧資料 Stack_push(&obj->T2,k); //匯入出口棧 } } int temp = 0; temp = Stack_Top(&obj->T2); Stack_pop(&obj->T2); //從出口棧匯出資料 return temp; //題幹要求返回匯出的值 }
4.查詢佇列頭部資料
這裡的頭部資料是正序的頭資料,因此要先將入口棧中的逆序資料匯入出口棧,
變成正序,再返回出口棧的棧頂資料 。
int myQueuePeek(MyQueue* obj) { if(Stack_Empty(&obj->T2)) //判斷出口棧中是否有資料 { int k = 0; for(;!Stack_Empty(&obj->T1);) //向出口棧匯入資料 { k = Stack_Top(&obj->T1); Stack_pop(&obj->T1); Stack_push(&obj->T2,k); } } return Stack_Top(&obj->T2); //返回出口棧棧頂資料 }
5.判斷佇列是否為空 及 銷燬佇列
//判斷佇列是否為空 bool myQueueEmpty(MyQueue* obj) { //判斷兩個棧是否均為空 return Stack_Empty(&obj->T1)&&Stack_Empty(&obj->T2); } //銷燬釋放佇列 void myQueueFree(MyQueue* obj) { Stack_pop(&obj->T1); Stack_pop(&obj->T2); free(obj); }
以上就是C語言資料結構之棧與佇列的相互實現的詳細內容,更多關於C語言 棧 佇列的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45