雙佇列實現佇列中元素排序

2021-06-28 23:19:11 字數 1147 閱讀 3940

題目要求對乙個佇列中的元素進行排序,只允許使用乙個臨時佇列,不能進行除去入隊、出隊、判空以外的任何操作。

實現方法為每次遍歷佇列,從中找出最小的元素,放入臨時佇列,遍歷的過程是出隊的過程,注意如果乙個元素比當前的最小值大,則要放回佇列當中,如果比當前的最小值小,則儲存起來,暫時不放回佇列中,發現更小的,把原來的最小值放入,更新最小值,在遍歷完一次以後,將最小值存入臨時佇列。然後開始第二次遍歷,注意每次遍歷原佇列中都會減少乙個元素,因此共遍歷佇列n次,每次對佇列n、n-1、n-2 ... 1這麼多次出隊操作來找最小值,在最後一次完成後臨時佇列中存放的就是排序好的結果,出隊n次即可按非降序輸出。

注意最壞的情況:如果最初的隊列為非降序,則會造成大量的無用功,因此在原佇列生成時就動態判斷是否是非降序列,如果是,則直接將原佇列列印。

#include#includeusing namespace std;

#define inf 99999999

#define maxsize 100001

typedef struct queue;

void initqueue(queue *q)

bool isempty(queue *q)

void addq(queue *q, int item)

q->rear = (q->rear + 1) % maxsize;

*(q->items + q->rear) = item;

}int deleteq(queue *q)

q->front = (q->front + 1) % maxsize;

return *(q->items + q->front);

}int main()

last = now;

} if (isrising)

printf("\n");

return 0;

} int min;

for (int i = 0; i < n; i++)

else

} addq(&tempq, min);

} printf("%d", deleteq(&tempq));

while (!isempty(&tempq))

printf("\n");

return 0;

}

堆疊 佇列 雙端佇列實現

author hao rui chun class stack object def init self self.lis defpush self,item 入棧 defpop self 出棧 self.lis.pop def peek self 獲取棧頂元素 if self.lis return...

雙棧實現佇列

include include include using namespace std templateclass cqueue cqueue void push back t data t pop front bool empty public cqueue t pdata,int len pri...

雙棧實現佇列

有兩個棧stack1和stack2,在push時,直接壓入stack1 在pop時,判斷stack2是否為空,空則將stack1的資料壓入stack2,不空則只需將stack2的棧頂彈出。ifndef myqueue h define myqueue h include includeusing n...