③队列&&栈的应用
由于栈比较简单就不写例程了啊><
队列:基本两个操作Enqueue(入队),Dequeue(出队)。
然后有两个元素:队尾(rear),队头(front)
保留一个数组Queue[],以及实际存在于队列中的元素个数Size。
操作:
入队:size,rear都要加1,Queue[rear]=X
出队:size减1,front加1
当然这样操作没多久队列就满了,所以我们用循环数组,只要front或rear到达尾端就绕回到开头
注意点:
①:检测队列是否为空(用size或是rear=front-1这个判断条件)
②:初始情况是:size=0,rear=0,front=1;
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct QueueRecord *Queue; 4 #define MAXSIZE 5; 5 struct QueueRecord{ 6 int Front; 7 int Rear; 8 int Size; 9 int* Array; 10 int Capacity;//队列最多有多少元素 11 }; 12 13 int isEmpty(Queue Q){ 14 return Q->Size == 0; 15 } 16 void MakeEmpty(Queue Q){ 17 Q->Size = 0; 18 Q->Front = 1; 19 Q->Rear = 0; 20 } 21 22 Queue Initial(){ 23 Queue Q = (Queue)malloc(sizeof(QueueRecord)); 24 MakeEmpty(Q); 25 Q->Capacity = MAXSIZE; 26 Q->Array = (int*)malloc(sizeof(int)*(Q->Capacity)); 27 return Q; 28 } 29 30 31 void Enqueue(int X, Queue Q){ 32 if (Q->Size == Q->Capacity){//isFull? 33 printf("the queue is full!"); 34 } 35 else{ 36 Q->Size++; 37 if (++Q->Rear == Q->Capacity){ 38 Q->Rear = 0; 39 } 40 Q->Array[Q->Rear] = X; 41 } 42 43 } 44 45 int Dequeue(Queue Q){ 46 int temp; 47 if (Q->Size == 0){ 48 printf("the queue is empty!"); 49 } 50 else { 51 Q->Size--; 52 temp = Q ->Array[Q->Front]; 53 if (++Q->Front == Q->Capacity){ 54 Q->Front = 0; 55 } 56 return temp; 57 } 58 } 59 void PrintQueue(Queue Q){ 60 int i; 61 if (Q->Size == 0){ 62 printf("the queue is empty!"); 63 } 64 else{ 65 if (Q->Rear < Q->Front){ 66 for (i = Q->Front; i < Q->Capacity; i++){ 67 printf("%d ", Q->Array[i]); 68 } 69 for (i = 0; i <= Q->Rear; i++){ 70 printf("%d ", Q->Array[i]); 71 } 72 } 73 else{ 74 for (i = Q->Front; i <= Q->Rear; i++){ 75 printf("%d ", Q->Array[i]); 76 } 77 } 78 } 79 }
栈应用:
① 平衡符号:比如检测事情是否成对([]):
做一个空栈,然后读入字符,如果是开放符号,就入栈,如果是封闭,则当栈空报错,否则将栈元素弹出,如果弹出的不是对应的开放符号,则报错。在文件尾,栈非空也报错。 O(N)
② 后缀表达式:
eg:4.99 1.06*5.99+6.99 1.06 *+ ->postfix后缀或是 逆波兰记法
求值过程就是:4.99*1.06+5.99+6.99*1.06
这时用栈呗:遇到数字推进去,遇到运算符弹出两个算一算,再把答案推进去。so easy!
③ 中缀到后缀的转换:
当读到操作数时,立即放到输出中;
当读到操作符时:①如果是左括号:推入栈中
②如果是右括号,弹出并输出栈元素直到遇到左括号,但左括号只弹出不输出。
③如果是其他的符号,从栈中弹出栈元素直到发现 优先级更低的元素。
④不管怎么样,左括号只有在遇到右括号的时候才被弹出。
⑤如果输入为空,则把所有栈元素都弹出。

浙公网安备 33010602011771号