使用兩個棧模擬一個佇列【C語言】
阿新 • • 發佈:2019-01-21
<span style="font-size:24px;">//以下所有程式碼均經過上機測試,如有錯誤請指正 #include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 //儲存空間初始分配量 #define STACKINCREMENT 10 //儲存空間分配增量 typedef struct{ int *base; int *top; int stacksize;} stack; int initStack(stack *s)//構造一個空棧 { s->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); if(s->base == NULL) { printf("儲存空間分配失敗!"); exit(-1); } s->top = s->base; s->stacksize = STACK_INIT_SIZE; return 1; } //壓棧的方法,i為需要壓入棧頂的元素 int push(stack *s,int i) { //判斷棧容量是否已經滿了,如果已滿,重新分配儲存空間 if(s->top - s->base >= s->stacksize) { s->base = (int *)realloc(s->base,(s->stacksize + STACKINCREMENT)*sizeof(int)); } if(s->base == NULL) { printf("記憶體分配失敗!"); exit(-1); } *s->top++ = i; //把元素壓棧 return 1; } //彈棧的方法 int pop(stack *s) { if(s->base == s->top) return -1; //本例中預設壓入棧中的元素都是正整數,所以返回-1表示棧空 //如果棧不空,則刪除棧頂元素並返回其值 return *--s->top; } //利用兩個棧模擬一個佇列 int main() { stack st1,st2; initStack(&st1); initStack(&st2); //假設傳入的佇列為 1,2,3,4,5,6 //則出佇列的時候順序為 1,2,3,4,5,6 //先在棧1中壓入這幾個數 int i; printf("進入佇列的序列為:\n"); for(i = 1; i < 7 ;i++) { push(&st1,i); printf("%d ",i); } printf("\n"); //出棧的時候每次先把1棧中除棧底元素之外的所有元素彈到2棧中 //然後再彈出1棧棧底元素 //最後再把2棧中的元素壓入1棧中 //重複以上動作,直到1棧為空 printf("出佇列的順序為:\n"); while(st1.base!= st1.top) { while((st1.top - st1.base) > 1) push(&st2,pop(&st1)); printf("%d ",pop(&st1)); while((st2.top - st2.base) > 0) push(&st1,pop(&st2)); } return 0; } </span>