1 //链式队列 2 #include<iostream> 3 4 using namespace std; 5 6 struct Node{ 7 int data; 8 Node* next;//C++不用写struct Node *next,因为Node可以指代类型 9 //构造函数 10 Node(int x){ 11 data = x; 12 next = NULL; 13 } 14 } 15 16 class Queue{ 17 private://队首队尾的指针应该是私有的 不是公共的 18 Node* front; 19 Node* rear; 20 public: 21 //链表有两种 带“空头结点(不保存数据只有next起引导作用)” 和不带“空头结点的”(一开始就存放数据的) 22 //下面采用不带 空头结点 的链表 23 Queue(){ 24 front = rear = NULL; 25 } 26 27 ~Queue(){ 28 Node* tmp; 29 while(front != NULL){ 30 tmp = front; 31 front = front->next; 32 delete tmp; 33 } 34 } 35 36 bool isEmpty(){ 37 return front == NULL; 38 } 39 40 // bool isFull() 不考虑队满 因为是链式队列 内存有多少用多少... 41 //因为内存有多少用多少 不考虑用完的情况 所以enQueue返回类型用了void 42 void enQueue(int x){ 43 /**谨记要考虑空队的情况 rear和front都指向这个元素*/ 44 Node* tmp; 45 tmp = new Node(x);//上面有构造函数了 46 if(isEmpty()){ 47 //调试语句 cout << "Empty" << tmp->data << endl; 48 front = rear = tmp; 49 } 50 else{ 51 //调试语句 cout << "Not Empty" << tmp->data << endl; 52 //在队尾挂一个点 不需要tmp->next =NULL了 因为构造函数里面写了 53 rear->next = tmp; 54 //记住新加入的元素要变成表尾 55 rear = tmp; 56 } 57 } 58 59 bool deQueue(int *px){ 60 if(isEmpty()) return false; 61 else{ 62 //谨记考虑出队之后队伍为空的情况 63 *px = front->data; 64 //调试语句 cout << "*px" << *px << endl; 65 Node * tmp; 66 tmp = front; 67 front = front->next;//表头指针往后移动 指向第二个点 68 delete tmp; 69 if(front == NULL) rear = NULL;//出队前就它一个元素 出队之后空了 70 return true; 71 } 72 } 73 } 74 75 int main(){ 76 Queue q; 77 q.enQueue(11); 78 q.enQueue(22); 79 q.enQueue(33); 80 q.enQueue(44); 81 q.enQueue(55); 82 int x; 83 x = 0; 84 cout << q.deQueue(&x) << endl; 85 cout << x << endl; 86 return 0; 87 }
银行排队
1 //银行排队 队列应用 模拟单队列排队 2 用程序简单模拟一个单队列多窗口的排队模式: 3 设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。 4 每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。 5 6 输入格式: 7 第一行输入一个不大于20的正整数N,表示银行等候区能容纳的人数, 8 接下来用若干行表示依时间顺序先后发生的“顾客想进银行”或“叫号”事件,格式分别是: 9 10 顾客想进银行,用 In <id> 表示,其中<id>是顾客编号,为不大于100000的正整数; 11 叫号,用Calling表示。 12 最后一行是一个#符号,表示输入结束。 13 注意: 14 15 题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。 16 保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。 17 输出格式: 18 对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是: 19 20 顾客想进银行,若顾客进入,则输出 <id> joined. Total:<t> 其中<id>是该顾客的编号,<t>是顾客进入后,等候区的人数 21 顾客想进银行,若因等候区满而被拒绝,则输出 <id> rejected. 其中<id>是该顾客的编号 22 叫号,若有顾客前往柜台,则输出 <id> called. Total:<t> 其中<id>是该顾客的编号,<t>是顾客去柜台后,等候区的人数 23 叫号,等候区无人,则输出 No one! 24 输入样例: 25 3 26 In 101 27 In 102 28 In 103 29 In 104 30 Calling 31 In 105 32 Calling 33 Calling 34 Calling 35 Calling 36 # 37 输出样例: 38 101 joined. Total:1 39 102 joined. Total:2 40 103 joined. Total:3 41 104 rejected. 42 101 called. Total:2 43 105 joined. Total:3 44 102 called. Total:2 45 103 called. Total:1 46 105 called. Total:0 47 No one! 48 49 #include<iostream> 50 #include<queue> 51 52 using namespace std; 53 54 int main(){ 55 int N; 56 cin >> N; 57 queue<string> q; 58 string op, id; 59 cin >> op; 60 while(op != '#'){ 61 if(op == "IN"){ 62 cin >> id; 63 if(q.size() == N){ 64 cout << id << " rejected." << endl; 65 } 66 else{ 67 q.push(id); 68 cout << id << " joined. Total:" << q.size() << endl; 69 } 70 } 71 else{ 72 if(q.empty()){ 73 cout << "No one!" << endl; 74 } 75 else{ 76 id = q.front(); 77 q.pop(); 78 cout << id << " called. Total:" << q.size() << endl; 79 } 80 } 81 cin >> op; 82 } 83 return 0; 84 }
内容来源于网络如有侵权请私信删除
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!