数据结构 · 两个栈实现的队列(使用线性结构实现)

一、引入

栈和队列的区别:

① 两者是不同的数据结构:

栈是后进先出,FILO;出入元素都是在同一端(栈顶),即最新的元素,而最先插入的被放在栈的底部,要到最后才能删除。

队列是先进先出,FIFO,即队列的修改是依次先进先出的原则进行的。新来的成员总是加入队尾(无法中间插入),每次离开的成员总是队列头上的(不允许中途离队)

二、思考

通过组装的方式 --- 利用两个栈来实现;让一个栈作为队列的入口,负责插入新元素;另外一个栈作为队列的出口,负责移除老元素。

让栈A中的所有元素按顺序出栈,再按照出栈顺序压入栈B。这样一来,元素从栈A弹出并压入栈B的顺序是3,2,1和当初进入栈A的顺序123是相反的。

这样两个栈就能够实现队列的功能了

三、实现

/*****************************************************
copyright (C), 2019-2020, Lighting Studio. Co.,     Ltd. 
File name:
Author:xozofunny    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/

#include 
#include 

typedef struct{
    int max_size;
    int top;
    int *stkspace;
}Stack; 

void init_stack(Stack **obj, int space);
int isEmpty(Stack *obj);
int isFull(Stack *obj);
int push(Stack *obj, int num);
int pop(Stack *obj);
void clear(Stack *obj);

int main()
{
    int i = 0;
    Stack *stk1 = NULL;
    Stack *stk2 = NULL;
    
    init_stack(&stk1, 5);
    init_stack(&stk2, 5);
    printf("sizeof(stk1) = %d\n", sizeof(*stk1));
    printf("sizeof(stk1) = %d\n", sizeof(*stk2));
    
    //stk1压栈
    for(; i < 5; i++)
    {
        push(stk1, i+1);
    }
    //stk1出栈的同时压入stk2
    for(i = 0; i < 5; i++)
    {
        push(stk2, pop(stk1));
    }

    //stk2出栈,以实现队列效果
    for(i = 0; i < 5; i++)
    {
        printf("%-3d", pop(stk2));
    }
    putchar('\n');
    
    clear(stk1);
    clear(stk2);
    return 0;
}

void init_stack(Stack **obj, int space)
{
    (*obj) = (Stack *)malloc(sizeof(Stack));
    (*obj)->top = -1;
    (*obj)->max_size = space > 0 ? space : 10;
    (*obj)->stkspace = (int *)malloc(sizeof(int) * ((*obj)->max_size));
}

int isEmpty(Stack *obj)
{
    if((-1) == obj->top)
        return 1;
    else
        return 0;
}

int isFull(Stack *obj)
{
    if((obj->top) == (obj->max_size - 1))
        return 1;
    else
        return 0;
}

int push(Stack *obj, int num)
{
    while(!isFull(obj))
    {
        obj->stkspace[++(obj->top)] = num;
        return 1;
    }
    return 0;
}

int pop(Stack *obj)
{
    int num, index;
    while(!isEmpty(obj))
    {
        index = obj->top;
        num = obj->stkspace[(obj->top)--];
        return num;
    }
    return (-1);
}

void clear(Stack *obj)
{
    free(obj->stkspace);
}

数据结构 · 两个栈实现的队列(使用线性结构实现)_第1张图片

当输入队列的是1->2->3->4->5 ; 输出的也仍然是1->2->3->4->5


 

 

你可能感兴趣的:(数据结构)