【题目】
用两个栈实现一个队列,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
【分析】
假设两个栈,栈1和栈2,来实现队列,栈1用来入队,栈2用来出队。
入队时,将元素全部压入栈1;
出队时,如果栈2不为空,就直接pop栈2,否则,就将栈1的所有元素pop到栈1里,再把栈2栈顶弹出。
由图所示,abcdef依次入队,压栈,出队时先将元素从s1弹出,压入s2,从s2出栈实现出队,即使后面再有元素入队,也是先压入s1,出队永远用s2。
【测试代码】
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAX 10
typedef int my_data;
typedef int Stack_data;
typedef struct StackNode
{
Stack_data data;
struct StackNode *next;
}my_stack, * my_stack_ptr;
typedef struct LinkStack
{
my_stack_ptr top;//栈顶是一个指针
int count;
}LinkStack;
void init(LinkStack *s)
{
my_stack_ptr first = (my_stack_ptr)malloc(sizeof(my_stack));
first->next = NULL;
s->top = first;
s->count = 0;
}
int stack_empty( LinkStack s )
{
if(s.top->next ==NULL)
return OK;
else
return ERROR;
}
int push(LinkStack *s, my_data e)
{
my_stack_ptr pnew = (my_stack_ptr )malloc(sizeof(my_stack ));
pnew ->data = e;
pnew-> next = s ->top;
s->top = pnew;
s->count++;
return OK;
}
int pop(LinkStack *s , my_data *e)
{
my_stack_ptr p;
if(stack_empty(*s))
return ERROR;
*e = s->top->data;
p = s->top;
s->top = s->top->next;
free(p);
s->count --;
return OK;
}
void enqueue(LinkStack *s1, LinkStack *s2, my_data e)
{
push(s1, e);
}
void dequeue(LinkStack *s1, LinkStack *s2, my_data *e)
{
if(stack_empty( *s2 )==1)//如果s2空
{
while(stack_empty(*s1 ) == 0)//s1不空
{
pop(s1,e);
push(s2, *e);
}
}
pop(s2,e);
}
void test(LinkStack *s1, LinkStack *s2, my_data *e)
{
int d[] = {1,2,3,4,5,6,7,8};
int length = 8;
printf("进栈顺序:\n");
for(int i =0 ; i<length; i++)
{
printf("%d",d[i]);
enqueue(s1,s2, d[i]);
}
printf("\n");
printf("出栈顺序:\n");
while(length--)
{
dequeue(s1,s2,e);
printf("%d",*e);
}
printf("\n");
}
void main()
{
LinkStack *s1= (LinkStack *)malloc(sizeof(LinkStack));
LinkStack *s2= (LinkStack *)malloc(sizeof(LinkStack));
init(s1);
init(s2);
my_data *e = (my_data *)malloc(sizeof(my_data));
test(s1,s2,e);
}
【输出】
【参考】
http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html
个人觉得此博客讲的比较清晰
原文地址:http://blog.csdn.net/xinyu913/article/details/46013607