栈:先进后出。
队列:先进先出
思想:
用两个栈来模拟队列:一个用来模拟入队列;一个用来模拟出队列。
当需要入队列时:先将二号栈中的所有数据压入一号栈,再将数据压入一号栈。
当需要出队列时:先将一号栈中的所有数据压入二号站,再从二号栈中执行出栈操作。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10 //栈的大小
struct stack{
int sta[SIZE];
int top;
};
//判断栈是否为空
int if_empty(struct stack* psta)
{
if(psta->top == -1)
return 1;
else
return 0;
}
//判断栈是否为满
int if_full(struct stack* psta)
{
if(psta->top == SIZE - 1)
return 1;
else
return 0;
}
//初始化栈
void init_stack(struct stack* psta)
{
psta->top = -1;
bzero(psta->sta, sizeof(int)*SIZE);
}
//入栈
int push_stack(struct stack* psta, int data)
{
if(if_full(psta)){
printf("stack is full. \n");
exit(1);
}
(psta->top)++;
psta->sta[psta->top] = data;
}
//出栈
int pop_stack(struct stack* psta)
{
if(if_empty(psta)){
printf("stack is empty. \n");
exit(1);
}
int tmp = psta->sta[psta->top];
(psta->top)--;
return tmp;
}
//用两个栈模拟队列的入队列和出队列
void stack_simulation_queue(struct stack* sta1, struct stack* sta2, int *a, int len)
{
int i = 0;
//用一号栈模拟入队列操作
for(i=0; i<len; i++)
push_stack(sta1, a[i]);
//将一号栈的元素放入二号栈
for(i=0; i<len; i++)
push_stack(sta2, pop_stack(sta1));
//用二号栈模拟出队列操作
for(i=0; i<len; i++)
printf("%d\t",pop_stack(sta2));
printf("\n");
}
int main()
{
struct stack sta1;
struct stack sta2;
init_stack(&sta1);
init_stack(&sta2);
int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
int i;
for(i=0; i<8; i++)
printf("%d\t", a[i]);
printf("\nstack simulation after: \n");
stack_simulation_queue(&sta1, &sta2, a, 8);
return 0;
}
结果: