day 10 第五章 栈与队列 今日任务: ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

day 10 第五章 栈与队列

今日任务:
● 理论基础
● 232.用栈实现队列
● 225. 用队列实现栈

232.用栈实现队列



typedef struct{
    int *stk;
    int stkSize;
    int stkCapacity;

}Stack;
Stack *stackCreate(int capacity){
    Stack* ret =malloc(sizeof(Stack));
    ret->stk=malloc(sizeof(int)*capacity);
    ret->stkSize=0;
    ret->stkCapacity=capacity;
    return ret;
}

void stackPush(Stack* obj,int x){
    obj->stk[obj->stkSize++]=x;
}
void stackPop(Stack* obj){
    obj->stkSize--;
}
int stackTop(Stack* obj){
return obj->stk[obj->stkSize-1];
}
bool stackEmpty(Stack* obj){
    return obj->stkSize==0;
}
void stackFree(Stack* obj){
    free(obj->stk);
}
typedef struct {
    Stack* inStack;
    Stack* outStack;
} MyQueue;


MyQueue* myQueueCreate() {
MyQueue* queue=malloc(sizeof(MyQueue));
queue->inStack=stackCreate(10);
queue->outStack=stackCreate(10);
return queue;
}

void in2out(MyQueue* obj){
    while (!stackEmpty(obj->inStack))
    {
     stackPush(obj->outStack,stackTop(obj->inStack));
     stackPop(obj->inStack);
    }
    
}
void myQueuePush(MyQueue* obj, int x) {
stackPush(obj->inStack,x);
}

int myQueuePop(MyQueue* obj) {
    if (stackEmpty(obj->outStack))
    {
    in2out(obj);
    }
    int x=stackTop(obj->outStack);
    stackPop(obj->outStack);
    return x;

}

int myQueuePeek(MyQueue* obj) {
if (stackEmpty(obj->outStack))
{
    in2out(obj);
}
return stackTop(obj->outStack);
}

bool myQueueEmpty(MyQueue* obj) {
return stackEmpty(obj->inStack) && stackEmpty(obj->outStack);
}

void myQueueFree(MyQueue* obj) {
stackFree(obj->inStack);
stackFree(obj->outStack);
}

  1. 用队列实现栈
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define maxStackNum	100	
typedef struct {
    int* data;
	int head;	
	int rear;
} MyStack;


MyStack* myStackCreate() {
 MyStack* stack = (MyStack*)malloc(sizeof(MyStack));	
	stack->data = (int*)malloc(sizeof(int) *           maxStackNum);
	stack->head = 0;	
	stack->rear = 0;
	return stack;
}

void myStackPush(MyStack* obj, int x) {
    int curRear=obj->rear;
    if((obj->rear+1)%maxStackNum==obj->head)
        return;
    obj->data[obj->rear]=x;
    obj->rear=(obj->rear+1)%maxStackNum;
    while(obj->head!=curRear){
        obj->data[obj->rear]=obj->data[obj->head];
        obj->head=(obj->head+1)%maxStackNum;
        obj->rear=(obj->rear+1)%maxStackNum;
    }
}

int myStackPop(MyStack* obj) {
    if(obj->head==obj->rear)	//栈空
		return NULL;
     int temp=obj->head;
     obj->head=(obj->head+1)%maxStackNum;
    return obj->data[temp];
}

int myStackTop(MyStack* obj) {
    if(obj->head == obj->rear)	//栈空
		return NULL;
 return obj->data[obj->head];
}

bool myStackEmpty(MyStack* obj) {
 return obj->rear==obj->head;
}

void myStackFree(MyStack* obj) {
    free(obj->data);
	free(obj);
}

这两道题虽然在平常的生产实践中应该不会这么做,但是对于锻炼站和队列的使用还是很有帮助的。尤其是实现用一个队列实战的效果。没听过讲解,不仔细思考,或许真的很难想出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Javie Deng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值