栈Stack基本功能实现

①头文件:

#pragma once //防止头文件被重复包含
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
//如果采用链表来实现栈,
//1)若采用尾插和尾删来操作栈,则需要使用双向链表来实现。
//2)若采用头插和头删来操作栈,可以使用单链表来实现

typedef int STDatatype;

typedef struct Stack{
	STDatatype* a;  //栈起始位置
	int top;    //栈顶位置
	int capacity;  //栈的容量
}ST;

void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDatatype x);
void StackPop(ST* ps);
STDatatype StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);


②函数实现文件:stack.c

#include"stack.h"

void StackInit(ST* ps){
	ps->a = (STDatatype*)malloc(sizeof(STDatatype)* 4);
	ps->capacity = 4;
	ps->top = 0;
	/*
	1)如果top 选择初始为 0,则在每次入栈或者出栈之后,
	top指向的都是栈顶元素的下一个位置。
	2)如果top 选择初始为 1,则在每次入栈或者出栈之后,
	top指向的都是栈顶元素的当前位置。
	*/
}


void StackDestroy(ST* ps){
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}


void StackPush(ST* ps, STDatatype x){
	assert(ps);
	
	//入栈之前要判断原栈是否已经满了
	if (ps->top == ps->capacity){
		STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
		//判断是否有足够的空间来扩容
		if (tmp == NULL){
			printf("realloc fail!");
			exit(-1);
		}
		else{
			ps->a = tmp;
			ps->capacity *= 2;
		}
	}

	ps->a[ps->top] = x;
	ps->top++;
}


void StackPop(ST* ps){
	assert(ps);
	//倘若原来栈中没有元素,则top = 0,这时候调用StackPop直接报错。
	assert(ps->top > 0);

	//通过直接调用top--,直接可以达到栈顶元素出栈的效果
	ps->top--;
}


STDatatype StackTop(ST* ps){
	assert(ps);
	//倘若原来栈中没有元素,则top = 0,这时候调用StackTop直接报错。
	assert(ps->top > 0);

	return ps->a[(ps->top) - 1];
}


int StackSize(ST* ps){
	assert(ps);
	return ps->top;
}


bool StackEmpty(ST* ps){
	assert(ps);
	//采用return后面直接接表达式的方式
	//1)如果top为0,则直接返回true
	//2)如果top不等于,则直接返回false
	return ps->top == 0;
}

③测试文件:

#include"stack.h"
#include"Quene.h"
void TestStack(){
	ST st;
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);
	StackPop(&st);
	StackPop(&st);
	StackPush(&st, 6); 

	while (!StackEmpty(&st)){
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	printf("\n");
	StackDestroy(&st);
}

void TestQuene(){
	Quene q;
	QueneInit(&q);
	QuenePush(&q, 1);
	QuenePush(&q, 2);
	QuenePush(&q, 9);
	QuenePush(&q, 8);
	QuenePush(&q, 5);
	QuenePush(&q, 6);
	QuenePop(&q);
	QuenePop(&q);
	printf("\n");
	printf("%d", QueneSize(&q));
}
int main(){
	TestQuene();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值