//------------剑指offer面试题9:两个栈实现一个队列------------
/*解题思路:一个栈用来入队一个栈用来出队,入队时直接压入stack1,出队时判断stack2是否为空
如果为空则将stack1的所有元素放到stack2中,否则直接弹出stack2中元素*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <assert.h>
# define MAXSIZE 10
typedef struct stack
{
int data;
struct stack* next;
int size;
}Stack,*pStack;
void initStack(pStack st)
{
assert(st != NULL);
st->size = 0;
st->next = NULL;
}
void Push(pStack st,int val)
{
assert(st != NULL);
if(st->size < MAXSIZE)
{
pStack s = (pStack)malloc(sizeof(Stack));
assert(s != NULL);
s->data = val;
s->next = st->next;
st->next = s;
st->size++;
}
else
{
printf("队已满,入队失败!\n");
}
}
bool isEmpty(pStack st)
{
assert(st != NULL);
if(st->next == NULL)
{
return true;
}
return false;
}
int GetTop(pStack st)
{
assert(st != NULL);
if(!isEmpty(st))
{
return st->next->data;
}
printf("stack is empty\n");
return 0;
}
void Pop(pStack st)
{
assert(st != NULL);
if(!isEmpty(st))
{
pStack p = st->next;
st->next = p->next;
free(p);
}
}
void DestroyStack(pStack st)
{
assert(st != NULL);
while(st->next != NULL)
{
Pop(st);
}
}
void PushQueue(pStack st1,pStack st2,int val)//入队操作
{
Push(st1,val);
printf("push true\n");
}
int GetQueueFirst(pStack st1,pStack st2)//得到出队的第一个元素
{
if(isEmpty(st2))
{
while(!isEmpty(st1))
{
Push(st2,GetTop(st1));
Pop(st1);
}
}
return GetTop(st2);
}
void PopQueue(pStack st1,pStack st2)
{
if(isEmpty(st2))
{
while(!isEmpty(st1))
{
Push(st2,GetTop(st1));
Pop(st1);
}
}
Pop(st2);
}
int main()
{
Stack st1,st2;
initStack(&st1);
initStack(&st2);
for(int i=0;i<5;i++)
{
PushQueue(&st1,&st2,i+1);
printf("%d\n",GetQueueFirst(&st1,&st2));
printf(" ");
}
printf("\n");
for(int i=0;i<5;i++)
{
PopQueue(&st1,&st2);
printf("%d\n",GetQueueFirst(&st1,&st2));
printf(" ");
}
}
输出结果如下: