C语言用栈实现队列

 

目录

前言

 栈的结构

栈的基本操作

队列的结构

队列的初始化

循环出栈

入队

出队

返回队头

判断队列是否为空

销毁队列


前言

    栈的特点是后进先出,而队列的特点是先进先出,如果要用栈实现队列的特点,这里可以用两个栈来实现,一个栈用于做入栈操作,另一个做出栈操作,在两个栈的配合下可以实现队列。

例如以下两个栈

 要想实现队列的特点,就得让1先出来,但单个栈只会先让4出来,所以我们再定义一个栈让栈1的元素一个一个移动到栈2,再让栈2的元素出栈即可完成先进先出的操作。

 栈的结构

    用于实现队列的两个栈的结构,没有什么特别的要求

typedef struct {
    int *stk;
    int size;
    int capacity;
}MyStack;

栈的基本操作

    栈的创建初始化,入栈,出栈,判断栈是否为空等

//创建栈
MyStack* StackCreat(int capacity){
    MyStack *ret=malloc(sizeof(MyStack));
    ret->stk=malloc(sizeof(int)*capacity);
    ret->size=0;
    ret->capacity=capacity;
    return ret;
}
//入栈
void StackPush(MyStack* obj,int x){
    obj->stk[obj->size++]=x;
}
//出栈
void StackPop(MyStack* obj){
    obj->size--;
}
//栈顶
int StackTop(MyStack* obj){
    return obj->stk[obj->size-1];
}
//判断栈空
int Stackempty(MyStack* obj){
    return obj->size==0;
}

//销毁栈
void StackFree(MyStack* obj){
    free(obj->stk);
}

队列的结构

    队列包含两个栈

typedef struct {
    MyStack *Instack;
    MyStack *Outstack;
} MyQueue;

队列的初始化

MyQueue* myQueueCreate() {
    MyQueue *ret=malloc(sizeof(MyStack));
    ret->Instack=StackCreat(100);//这里每个栈容量为100
    ret->Outstack=StackCreat(100);
    return ret;
}

循环出栈

    我们需要一个循环出栈的操作,将栈1的元素全部搬移到栈2

//循环出栈
void in_out(MyQueue* ret){
    while(!Stackempty(ret->Instack)){
        StackPush(ret->Outstack,StackTop(ret->Instack));
        StackPop(ret->Instack);
    }
}

入队

入队只需要做入栈操作即可

void myQueuePush(MyQueue* obj, int x) {
    StackPush(obj->Instack,x);
}

出队

    将栈1的元素搬移到栈2的操作需要有一个前提:栈2为空。如果栈2不为空则需要先把栈2的所有元素全部出栈后才能进行搬移操作


int myQueuePop(MyQueue* obj) {//出队
    if(Stackempty(obj->Outstack)){
        in_out(obj);
    }
    int a=StackTop(obj->Outstack);
    //StackPop(obj->Outstack);
    obj->Outstack->size--;
    return a;
}

返回队头

    也就是栈2的栈顶元素

int myQueuePeek(MyQueue* obj) {//返回队头
    if(Stackempty(obj->Outstack)){
        in_out(obj);
    }
    return StackTop(obj->Outstack);
}

判断队列是否为空

bool myQueueEmpty(MyQueue* obj) {
    if(Stackempty(obj->Instack) && Stackempty(obj->Outstack))
        return true;
    return false;
}

销毁队列

void myQueueFree(MyQueue* obj) {
    StackFree(obj->Instack);
    StackFree(obj->Outstack);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值