C語言 兩個棧實現佇列的操作
阿新 • • 發佈:2019-01-09
思路:
1,先初始化兩個具有一定儲存空間的空棧
2,把元素壓入棧1,完成入隊操作。由於棧是後進先出的,要實現佇列的功能(即先進先出)必須藉助另一個棧來實現
3,完成出隊的操作,先把棧1的棧頂元素依次彈出並壓入棧2,直到棧1的棧低元素。這樣棧2中從棧頂到棧底的元素依次是壓入棧1的順序了。這樣可以把棧2的元素依次彈出,實現了佇列的出隊操作。
4,如果,元素沒有完全出隊,而又有新元素要入隊時。此時,棧2中是還有元素沒有完全彈出的。同樣先把,元素壓入棧1,。
5,此時要完成出佇列操作,由於棧2中還有元素,意味著棧2中這些元素比新壓入棧1的元素先到佇列,應該先出隊。那麼只要棧2中還有元素,就從棧2中彈出元素完成出隊操作;否則把棧1中的元素依次彈出並壓入棧2。探後從棧2中,彈出元素完成出隊操作。
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include <iostream> #define STACK_INIT_SIZE sizeof(struct stack)*10 #define STACKINCREASWMENT sizeof(struct stack) struct stack{ int *base; int *top; int stacksize; }; int initStack(stack *s)//構造一個空棧 { s->base = (int *)malloc(sizeof(struct stack)*STACK_INIT_SIZE); if(s->base == NULL) exit(-1); s->top = s->base; s->stacksize = STACK_INIT_SIZE; return 1; } int push(stack *s,int num)//壓棧 { //先判斷棧的記憶體是否夠用,不夠用需要從新分配記憶體 if(s->top - s->base >= s->stacksize - sizeof(struct stack)) s->base = (int *)realloc(s->base,s->stacksize + sizeof(struct stack)); if(s->base == NULL) //記憶體分配失敗 exit(-1); *s->top++ = num;//注意 優先順序 return 1; } int pop(stack *s)//彈棧 { if(s->base == s->top)//空棧,無棧可彈 return -1; return *(--s->top); } /* stack addElementToQueen(int nums[],int length) { if(sizeof(nums)/sizeof(int) != length) exit(-1); stack s; initStack(&s); for(int i=0;i<length;i++) { push(&s,*(nums + i)); } return s; } int deleteElementInQueen(struct stack s1) { stack s2; initStack(&s2); int n; if(s2->top - s2->base <= 0) { while((s1->top - s1->base) >= 0) { n = s1->top; pop(&s1); push(&s2,n); } } if(s2->top - s2->base == 0)//換棧失敗 return NULL; n = pop(s2); return n; } */ void main() { stack s1,s2; initStack(&s1); initStack(&s2); int nums[] = {1,2,3,4,5,6}; printf("壓入棧 1\n"); for(int i=0;i<6;i++) { push(&s1,*(nums + i)); } printf("出隊的順序為:\n"); while(s1.base != s1.top) { while(s1.top - s1.base >1) push(&s2,pop(&s1)); printf("%d \t",pop(&s1)); while(s2.top - s2.base > 0) push(&s1,pop(&s2)); } printf("\n"); }