使用队列实现栈

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define eleType int

// 定义一个结构体队列
typedef struct {
eleType* elements; // 队列列表
size_t front; // 首元素索引
size_t rear; // 尾元素索引S
size_t capacity; // 队列容量
}Queue;

// 队列初始化
void Queuecreat(Queue* q){
q->elements = (eleType*)malloc(sizeof(eleType) * 8); // 分配八个eleType大小元素空间
q->front = 0; // 首元素索引为0
q->rear = 0; // 尾元素索引为0
q->capacity = 8; // 容量初始化为8
}

// 队列的销毁
void Queuedestroy(Queue* q){
free(q->elements); // 释放空间
q->front = 0;
q->rear = 0;
q->capacity = 0;
q->elements = NULL;
}

// 队列的扩容
void Queueresize(Queue* q){
eleType* newq = (eleType*)realloc(q->elements,sizeof(eleType)*(q->capacity * 2)); // 重新分配空间为原来的2倍
q->elements = newq; // 原来的更新为新的
q->capacity = q->capacity * 2; // 容量乘以2
}

// 入队
void Queuepush(Queue* q,eleType element){
if(q->rear == q->capacity){ // 如果队尾索引等于容量说明队列满了,进行扩容操作
Queueresize(q);
}
q->elements[q->rear++] = element; //
}

// 出队
eleType Queuepop(Queue* q){
if(q->front == q->rear){
printf(“空\n”);
exit(1);
}
return q->elements[q->front++];
}

// 获取队首元素
eleType Queuetop(Queue* q){
if(q->front == q->rear){
printf(“空\n”);
exit(1);
}
return q->elements[q->front];
}

// 获取队列大小
size_t Queuesize(Queue* q){
return q->rear - q->front; // 尾部索引减去头部索引就是队列大小
}

typedef struct{
Queue q1;
Queue q2;
}Mystack;

Mystack* Mystackcreat(){
Mystack* obj = (Mystack*)malloc(sizeof(Mystack));
Queuecreat(&obj->q1);
Queuecreat(&obj->q2);
return obj;
}

void MystackDestory(Mystack* obj){
Queuedestroy(&obj->q1);
Queuedestroy(&obj->q2);
}

void Mystackpush(Mystack* obj,int element){
Queuepush(&obj->q1,element);
}

int Mystackpop(Mystack* obj){
while(Queuesize(&obj->q1) > 1){
Queuepush(&obj->q2,Queuepop(&obj->q1));
}
int value = Queuepop(&obj->q1);
while(Queuesize(&obj->q2) > 0){
Queuepush(&obj->q1,Queuepop(&obj->q2));
}
return value;
}

int Mystacktop(Mystack* obj){
while(Queuesize(&obj->q1) > 1){
Queuepush(&obj->q2,Queuepop(&obj->q1));
}
int value = Queuepop(&obj->q1);
Queuepush(&obj->q2,value);
while(Queuesize(&obj->q2) > 0){
Queuepush(&obj->q1,Queuepop(&obj->q2));
}
return value;
}

bool Mystackempty(Mystack* obj){
return Queuesize(&obj->q1) == 0;
}

int main(){
Mystack* stk = Mystackcreat();
Mystackpush(stk,10);
Mystackpush(stk,20);
Mystackpush(stk,30);
while(!Mystackempty(stk)){
printf(“top is %d\n”,Mystacktop(stk));
printf(“pop is %d\n”,Mystackpop(stk));
}
MystackDestory(stk);
return 0;
}
在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值