用两个栈来模拟出队顺序
栈的出队顺序为FILO
队的出队顺序为FIFO
那么用两个栈来实现队的FIFO顺序如何实现呢?
看代码以及伪代码讲解
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define MAXSIZE 5 typedef struct stack { int data[MAXSIZE]; int top; }S; bool isEmpty(S *s) { if(s->top==-1) return true; else return false; } void Push(S *s,int e){ s->data[++s->top]=e; } int Pop(S *s){ int e=s->data[s->top--]; return e; } /* //当有元素进入要压栈进入s1时 当s1是满栈的时候 如果s2不是空栈 不可以对s1压栈,否则出队错误 当s2是空栈的时候 把s1的元素全部弹栈压入s2 再把要压入的元素压入s1 s1不是满栈的时候 s2为空 直接将元素压入s1 */ /* //当元素要从s2模拟出队的时候 if s2不为空的时候 s2直接弹栈 else s1为空 总体为空栈 return false s1有元素的时候 s1全部元素按出栈顺序压入s2 s2再一一弹栈 */ bool EnQueue(S *s1,S *s2,int x){ if(s1->top==MAXSIZE-1) { if(!isEmpty(s2)) return false; else { while(!isEmpty(s1)) { int element=Pop(s1); Push(s2,element); } Push(s1,x); return true; } } else { Push(s1,x); return true; } } bool DeQueue(S *s1,S *s2,int number){ if(!isEmpty(s2)){ number=s2->data[s2->top--]; printf("%d ",number); return true; } else{ if(isEmpty(s1)){ printf("对空,无法输出 "); return false; } else{ while(!isEmpty(s1)){ int element=Pop(s1); Push(s2,element); } number=Pop(s2); return number; } } } int main(){ S *s1=(S *)malloc(sizeof(S)); S *s2=(S *)malloc(sizeof(S)); s1->top=-1; s2->top=-1; int m=0; while(m<5){ EnQueue(s1,s2,m++); } for(int i=0;i<MAXSIZE;i++){ printf("%d ",s1->data[i]); } int number; while((s2->top)>=-1) DeQueue(s1,s2,number); }