③队列&&栈的应用

由于栈比较简单就不写例程了啊><

队列:基本两个操作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 }
View Code

 

 

栈应用:

① 平衡符号:比如检测事情是否成对([]):

     做一个空栈,然后读入字符,如果是开放符号,就入栈,如果是封闭,则当栈空报错,否则将栈元素弹出,如果弹出的不是对应的开放符号,则报错。在文件尾,栈非空也报错。  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!

 

③ 中缀到后缀的转换:

      当读到操作数时,立即放到输出中;

      当读到操作符时:①如果是左括号:推入栈中

                            ②如果是右括号,弹出并输出栈元素直到遇到左括号,但左括号只弹出不输出。

                            ③如果是其他的符号,从栈中弹出栈元素直到发现 优先级更低的元素。

                            ④不管怎么样,左括号只有在遇到右括号的时候才被弹出。

                            ⑤如果输入为空,则把所有栈元素都弹出。

posted @ 2015-02-22 16:46  stezqy  阅读(170)  评论(0)    收藏  举报