1. 程式人生 > >雙棧模擬隊列與雙隊列模擬棧

雙棧模擬隊列與雙隊列模擬棧

一位 分享圖片 eem 控制 條件 stdlib.h define turn pan

1.兩個隊列共享一個環形向量空間,將這兩個隊列模擬成棧,並實現十進制轉化為二進制

程序如下:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define maxSize 20
  4 typedef int DataType;
  5 typedef struct
  6 {
  7     DataType elem[maxSize];
  8     int front[2],rear[2];
  9 }DualQueue;
 10 void InitQueue(DualQueue *Q)
11 { 12 Q->front[0]=Q->rear[0]=0; 13 Q->front[1]=Q->rear[1]=maxSize/2; 14 } 15 int EnQueue(DualQueue *Q,DataType x,int flag) 16 { 17 if(flag<0||flag>1) 18 { 19 return 0; 20 } 21 if(Q->front[flag]==Q->rear[1-flag]) 22 { 23 if
(Q->front[1-flag]==Q->rear[flag]) //假設另一個隊列也滿 24 { 25 return 0; 26 } 27 //不滿則將另一個隊列向前挪動一位置 28 for(int i=Q->rear[1-flag];i!=Q->front[1-flag];i=(i-1)%maxSize) 29 { 30 Q->elem[(i+1)%maxSize]=Q->elem[i-1]; 31 }
32 Q->rear[1-flag]=(Q->rear[1-flag]+1)%maxSize; 33 Q->front[1-flag]=(Q->front[1-flag]+1)%maxSize; 34 35 Q->rear[flag]=(Q->rear[flag]+1)%maxSize; 36 Q->elem[Q->rear[flag]]=x; 37 return 1; 38 } 39 Q->rear[flag]=(Q->rear[flag]+1)%maxSize; 40 Q->elem[Q->rear[flag]]=x; 41 return 1; 42 } 43 int DeQueue(DualQueue *Q,DataType *x,int flag) 44 { 45 if(flag<0||flag>1) 46 { 47 return 0; 48 } 49 if(Q->front[flag]==Q->rear[flag]) 50 { 51 return 0; 52 } 53 Q->front[flag]=(Q->front[flag]+1)%maxSize; 54 *x=Q->elem[Q->front[flag]]; 55 return 1; 56 } 57 void QStackInit(DualQueue *Q) 58 { 59 InitQueue(Q); 60 } 61 bool QStackEmpty(DualQueue *Q) 62 { 63 if(Q->front[0]==Q->rear[0]&&Q->front[1]==Q->rear[1]) 64 { 65 return true; 66 } 67 else 68 { 69 return false; 70 } 71 } 72 bool QStackFull(DualQueue *Q) 73 { 74 if(Q->front[0]==Q->rear[1]&&Q->front[1]==Q->rear[0]) 75 { 76 return true; 77 } 78 else 79 { 80 return false; 81 } 82 } 83 bool QStackPush(DualQueue *Q,int x) 84 { 85 if(QStackFull(Q)) 86 { 87 return false; 88 } 89 if(QStackEmpty(Q)) 90 { 91 EnQueue(Q,x,0); 92 } 93 else if(!(Q->front[0]==Q->rear[0])) 94 { 95 EnQueue(Q,x,0); 96 } 97 else 98 { 99 EnQueue(Q,x,1); 100 } 101 return true; 102 } 103 bool QStackPop(DualQueue *Q,int *x) 104 { 105 if(QStackEmpty(Q)) 106 { 107 return false; 108 } 109 if(!(Q->front[0]==Q->rear[0])) 110 { 111 while(1) 112 { 113 DeQueue(Q,x,0); 114 if(!(Q->front[0]==Q->rear[0])) 115 { 116 EnQueue(Q,*x,1); 117 } 118 else 119 { 120 break; 121 } 122 } 123 } 124 else 125 { 126 while(1) 127 { 128 DeQueue(Q,x,1); 129 if(!(Q->front[1]==Q->rear[1])) 130 { 131 EnQueue(Q,*x,0); 132 } 133 else 134 { 135 break; 136 } 137 } 138 } 139 return true; 140 } 141 int main() 142 { 143 DualQueue Q; 144 QStackInit(&Q); 145 int x,i,result=0; 146 printf("請輸入一個十進制數:\n"); 147 scanf("%d",&x); 148 while(x!=0) 149 { 150 i=x%2; 151 x=x/2; 152 QStackPush(&Q,i); 153 } 154 while(!QStackEmpty(&Q)) 155 { 156 QStackPop(&Q,&i); 157 result=result*10+i; 158 } 159 printf("二進制為:%d\n",result); 160 }

運行結果如下:

技術分享圖片

在此程序中,應註意如果一個隊列滿了,而另一個隊列未滿,則可以移動元素位置,改變隊列空間,與棧浮動技術相似。同時在挪動位置的過程中,循環控制條件不應設為>,而應該為!=。

2.使用兩棧模擬一個隊列,並實現輸出楊輝三角

程序如下:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 typedef int SElemType;
  4 typedef struct node
  5 {
  6     SElemType data;
  7     struct node *link;
  8 }LinkNode,*LinkStack;
  9 void StackInit(LinkStack *S)
 10 {
 11     (*S)=NULL;
 12 }
 13 int StackEmpty(LinkStack *S)
 14 {
 15     return (*S)==NULL;
 16 }
 17 int StackPush(LinkStack *S,SElemType x)
 18 {
 19     LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
 20     p->data=x;
 21     p->link=(*S);
 22     (*S)=p;
 23     return 1;
 24 }
 25 int StackPop(LinkStack *S,SElemType *x)
 26 {
 27     if(S==NULL)
 28     {
 29         return 0;
 30     }
 31     LinkNode *p=(*S);
 32     *x=p->data;
 33     (*S)=p->link;
 34     free(p); 
 35     return 1;
 36 }
 37 void SQueueInit(LinkStack *S1,LinkStack *S2)
 38 {
 39     StackInit(S1);
 40     StackInit(S2);
 41 }
 42 bool SQueueEmpty(LinkStack *S1,LinkStack *S2)
 43 {
 44     if(StackEmpty(S1)&&StackEmpty(S2))
 45     {
 46         return true;
 47     }
 48     return false;
 49 }
 50 int EnSQueue(LinkStack *S1,LinkStack *S2,int x)
 51 {
 52     if(SQueueEmpty(S1,S2))
 53     {
 54         StackPush(S1,x);
 55     }
 56     else if(!StackEmpty(S1))
 57     {
 58         StackPush(S1,x);
 59     }
 60     else 
 61     {
 62         StackPush(S2,x);
 63     }
 64     return 1; 
 65 }
 66 int DeSQueue(LinkStack *S1,LinkStack *S2,int *x)
 67 {
 68     if(SQueueEmpty(S1,S2))
 69     {
 70         return 0;
 71     }
 72     if(!StackEmpty(S1))
 73     {
 74         while(1)
 75         {
 76             StackPop(S1,x);
 77             if(!StackEmpty(S1))
 78             {
 79                 StackPush(S2,*x);
 80             }
 81             else
 82             {
 83                 break;
 84             }
 85         }
 86         int temp;
 87         while(1)
 88         {
 89             StackPop(S2,&temp);
 90             StackPush(S1,temp);
 91             if(StackEmpty(S2))
 92             {
 93                 break;
 94             }
 95         }
 96     }
 97     else
 98     {
 99         while(1)
100         {
101             StackPop(S2,x);
102             if(!StackEmpty(S2))
103             {
104                 StackPush(S1,*x);
105             }
106             else
107             {
108                 break;
109             }
110         }
111         int temp;
112         while(1)
113         {
114             StackPop(S1,&temp);
115             StackPush(S2,temp);
116             if(StackEmpty(S1))
117             {
118                 break;
119             }
120         }
121     }
122 }
123 void YangHvi(int n)
124 {
125     LinkStack S1,S2;
126     SQueueInit(&S1,&S2);
127     EnSQueue(&S1,&S2,1);
128     EnSQueue(&S1,&S2,1);
129     int i,j;
130     int s=0,t;
131     for(int i=1;i<=n;i++)
132     {
133         printf("\n");
134         EnSQueue(&S1,&S2,0);
135         for(int j=i;j<=n-1;j++)
136         {
137             printf("%2c", );
138         }
139         for(int j=1;j<=i+2;j++)
140         {
141             DeSQueue(&S1,&S2,&t);
142             EnSQueue(&S1,&S2,s+t);
143             s=t;
144             if(j!=i+2)
145             {
146                 printf("%4d",s);
147             }
148         }
149     }
150 }
151 main()
152 {
153     int n;
154     printf("請輸入行數:\n");
155     scanf("%d",&n);
156     YangHvi(n);
157 }

運行結果如下:

技術分享圖片

在此程序中應註意的是,模擬隊列與模擬棧的細微區別(僅依據這兩個程序而言):輸入元素基本一樣,輸出元素,在模擬棧中還多了一步,將棧1的元素(除最後一個元素)全部傳給棧2,然後輸出元素,最後還需要將棧2的全部元素又傳回給棧1.

雙棧模擬隊列與雙隊列模擬棧