剑指offer——day1

在这里插入图片描述

题目一
在这里插入图片描述

题目主要考察的是对栈和队列的理解和基本实现

typedef int STDataType;
#define DEFSTACKSIZE 100
typedef struct Stack
{
	STDataType* array;
	int size;		
	int capacity;  
}Stack;
void CheckCapacity(Stack* ps)
{
	if (ps->size >= ps->capacity)
	{
		ps->capacity *= 2;
		ps->array = (STDataType *)realloc(ps->array, ps->capacity * sizeof(STDataType));
	}
}
void StackInit(Stack* ps)
{
	ps->array = (STDataType *)calloc(DEFSTACKSIZE, sizeof(STDataType));
	ps->capacity = DEFSTACKSIZE;
	ps->size = 0;
}
void StackPush(Stack* ps, STDataType x)
{
	CheckCapacity(ps);
 
	ps->array[ps->size] = x;
	ps->size++;
}
void StackPop(Stack* ps)
{
	if (ps->size == 0)
	{
		return;
	}
	ps->size--;
}
STDataType StackTop(Stack* ps)
{
	if (ps->size == 0)
	{
		return (STDataType)-1;
	}
	return ps->array[ps->size - 1];
}
int StackEmpty(Stack* ps)
{
	return ps->size == 0;
}
int StackSize(Stack* ps)
{
	return ps->size;
}
void StackDestory(Stack* ps)
{
	if (ps->array)
	{ 
		free(ps->array);
		ps->array = NULL;
		ps->size = 0;
		ps->capacity = 0;
	}
}
typedef struct {
    Stack addstack;
    Stack delstack;
} CQueue;


CQueue* cQueueCreate() {
    CQueue* obj=(CQueue*)malloc(sizeof(CQueue));
    StackInit(&obj->addstack);
    StackInit(&obj->delstack);
    return obj;
}

void cQueueAppendTail(CQueue* obj, int value) {
    StackPush(&obj->addstack,value);
}

int cQueueDeleteHead(CQueue* obj) {
    assert(obj);
    if(StackEmpty(&obj->delstack))
    {
        while(!StackEmpty(&obj->addstack))
        {
            StackPush(&obj->delstack,StackTop(&obj->addstack));
            StackPop(&obj->addstack);
        }
    }
    int res=StackTop(&obj->delstack);
    StackPop(&obj->delstack);
    return res;
}

void cQueueFree(CQueue* obj) {
    StackDestory(&obj->addstack);
    StackDestory(&obj->delstack);
    free(obj);
}

题目二
在这里插入图片描述

结构体中多存放一个min成员保存最小元素

//实现栈
#define DEFSTACKSIZE 100
typedef struct {
    int *a;
    int top;
    int capacity;
    int min;
} MinStack;

/** initialize your data structure here. */

void checkstack(MinStack*obj)
{
    if (obj->top >= obj->capacity)
	{
	    obj->capacity *= 2;
		obj->a = (int*)realloc(obj->a, obj->capacity * sizeof(int));
	}
}

MinStack* minStackCreate() {
    MinStack* obj=(MinStack*)malloc(sizeof(MinStack));
    obj->top=0;
    obj->capacity=DEFSTACKSIZE;
    obj->a=(int*)calloc(DEFSTACKSIZE, sizeof(int));
    obj->min=INT_MAX;
    return obj;
}

void minStackPush(MinStack* obj, int x) {
    checkstack(obj);
    obj->a[obj->top]=x;
    obj->min=obj->min < x?obj->min:x;
    obj->top++;
}

void minStackPop(MinStack* obj) {
    obj->top--;
    if(obj->top==0)
    {
        obj->min=INT_MAX;
    }
    if(obj->top>0)
    {
        obj->min=obj->a[obj->top-1];
    }
    for(int i=obj->top-1;i>=0;i--)
    {
        if(obj->a[i]<obj->min)
        {
            obj->min=obj->a[i];
        }
    }
    
}

int minStackTop(MinStack* obj) {
    if(obj->top==0)
    {
        return ;
    }
    return obj->a[obj->top-1];

}

int minStackMin(MinStack* obj) {
    if(obj->top==0)
    {
        return ;
    }
    return obj->min;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

影中人lx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值