用栈实现队列---用两个栈模拟实现一个队列

该博客介绍了如何使用两个栈来模拟队列的操作,包括入队、出队、获取队头元素和判断队列是否为空。在入队时,元素直接进入第一个栈s1;出队时,如果第二个栈s2为空,则将s1的所有元素转移到s2,然后从s2出栈。这样可以有效地利用栈的特性来实现队列的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 入队列:直接将元素放进s1(s1栈顶为模拟队列的队尾);

出队列:如果s2非空,直接让s2出栈(s2栈顶为模拟队列的队头);

             如果s2为空,将s1中所有元素导入s2中,然后让s2出栈。

获取队头元素:找s2;

判空:s1&&s2都是空;

typedef int DataType;
typedef struct stack{
    DataType* array;
    int capacity;
    int top;
}stack;

//栈初始化
void initStack(stack* mystack)
{
    mystack->capacity=3;
    assert(mystack);
    mystack->array=(DataType*)malloc(sizeof(DataType)*mystack->capacity);
    if(mystack->array==NULL)
    {
        return;
    }
    mystack->top=0;
}

//栈判空
bool emptyStack(stack* mystack)
{
    assert(mystack);
    return mystack->top==0;
}

//检查栈是否满
void StackCheckCapacity(stack* ps)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newCapacity = (ps->capacity << 1);

		// 1. 开辟新空间
		DataType* temp = (DataType*)malloc(sizeof(DataType)* newCapacity);
		if (NULL == temp)
			assert(0);

		// 2. 拷贝元素
		memcpy(temp, ps->array, sizeof(DataType)*ps->capacity);

		// 3. 释放旧空间,使用新空间
		free(ps->array);
		ps->array = temp;
		ps->capacity = newCapacity;
	}
}

//入栈
void pushStack(stack* mystack,DataType data)
{
    StackCheckCapacity(mystack);
    assert(mystack);
    mystack->array[mystack->top]=data;
    mystack->top++;

}

//出栈
void popStack(stack* mystack)
{
   assert(mystack);
   mystack->top-=1;

}

//获取栈顶元素
DataType  topStack(stack* mystack)
{
    assert(mystack);
    return mystack->array[mystack->top-1];
}

//销毁栈
void destoryStack(stack* mystack)
{

    assert(mystack);
    if(mystack->array)
    {
        free(mystack->array);
    }
    mystack->top=0;
    mystack->capacity=0;


}


typedef struct {
    stack s1;
    stack s2;

} MyQueue;


//模拟队列初始化
MyQueue* myQueueCreate() {
   MyQueue* mq=(MyQueue*)malloc(sizeof(MyQueue));
    if(mq==NULL)
    {
        assert(0);
        return NULL;
    }
    assert(mq);
    initStack(&mq->s1);
    initStack(&mq->s2);
    return mq;

}

//队列入队
void myQueuePush(MyQueue* obj, int x) {
    assert(obj);
    pushStack(&obj->s1,x);

}

//队列出队
int myQueuePop(MyQueue* obj) {
    assert(obj);
    if(emptyStack(&obj->s2))
    {
      while(!(emptyStack(&obj->s1)))
      {
          pushStack(&obj->s2,topStack(&obj->s1));
          popStack(&obj->s1);
      }

    }
     DataType ele= topStack(&obj->s2);
    popStack(&obj->s2);
    return ele;

}

//获取队头元素
int myQueuePeek(MyQueue* obj) {

    assert(obj);
    if(emptyStack(&obj->s2))
    {
        while(!(emptyStack(&obj->s1)))
      {
          pushStack(&obj->s2,topStack(&obj->s1));
          popStack(&obj->s1);
      }

    }
    return topStack(&obj->s2);


}

//队列判空
bool myQueueEmpty(MyQueue* obj) {
    assert(obj);
    return emptyStack(&obj->s1)&&emptyStack(&obj->s2);

}

//模拟队列的销毁
void myQueueFree(MyQueue* obj) {
    assert(obj);
    destoryStack(&obj->s1);
    destoryStack(&obj->s2);
    free(obj);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值