栈ADT的实现(C语言数组实现)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define EmptyTos -1
#define MinStackSize 5

//数组类型声明
struct Stack
{
	int topOfStack; //栈顶角标,用于控制栈的有效数据范围
	int capacity; //栈的容量
	int* array; //指针,指向一维数组首元素的地址
};

//创建一个栈
struct Stack* createStack(int maxElements)
{
	struct Stack* s;
	if (maxElements < MinStackSize)
	{
		printf("stack size is too small.\n");
		return NULL;
	}

	s = (struct Stack*)malloc(sizeof(struct Stack));

	if (s == NULL)
	{
		printf("Out of space!\n");
		return NULL;
	}

	s->array = (int*)malloc(sizeof(int)*maxElements);

	if (s->array == NULL)
	{
		printf("Out of space!\n");
		return NULL;
	}

	s->topOfStack = EmptyTos;
	s->capacity = maxElements;

	return s;
}

//判断是否为空栈
bool isEmpty(struct Stack* s)
{
	return s->topOfStack == EmptyTos;
}

//判断栈是否为满
bool isFull(struct Stack* s)
{
	return s->capacity == s->topOfStack + 1;
}

//打印栈中所有元素
void printStack(struct Stack* s)
{
	int i;
	for (i = 0; i < s->topOfStack + 1; i++)
	{
		printf("element is:%d\n", s->array[i]);
	}
}

//释放栈内存
void disposeStack(struct Stack* s)
{
	if (s != NULL)
	{
		free(s->array);
		free(s);
	}
}

//入栈
void push(int x, struct Stack* s)
{
	if (isFull(s))
	{
		printf("full stack\n");
		return;
	}
	else
	{
		s->array[++s->topOfStack] = x;
	}
}

//查看栈顶元素,并返回元素值
int top(struct Stack* s)
{
	if (!isEmpty(s))
	{
		return s->array[s->topOfStack];
	}

	printf("empty stack\n");
	return 0;
}

//出栈
void pop(struct Stack* s)
{
	if (isEmpty(s))
	{
		printf("empty stack\n");
		return;
	}
	else
	{
		s->topOfStack--;
	}
}

//返回栈顶值并出栈
int topAndPop(struct Stack* s)
{
	if (!isEmpty(s))
	{
		return s->array[s->topOfStack--];
	}

	printf("empty stack\n");
	return 0;
}

//清空栈
void makeEmpty(struct Stack* s)
{
	s->topOfStack = EmptyTos;
}


//主函数
int main(void)
{
	int val;
	struct Stack* s;

	//创建一个栈
	s = createStack(10);

	//压栈
	push(5, s);
	push(2, s);
	push(3, s);
	//显示栈中的元素值
	printStack(s);
	printf("===========================\n");

	//查看栈顶元素值
	val = top(s);
	printf("top val is:%d\n", val);
	printf("===========================\n");

	//栈顶元素出栈
	pop(s);
	pop(s);
	//查看栈顶元素,并返回元素值
	val = top(s);
	printf("top val is:%d\n", val);
	printf("===========================\n");

	//压栈
	push(6, s);
	push(7, s);
	//显示栈中的元素值
	printStack(s);
	printf("===========================\n");

	//返回栈顶值并出栈
	val=topAndPop(s);
	printf("val=%d\n",val);
	//显示栈中的元素值
	printStack(s);
	printf("===========================\n");

	//判断栈是否为满
	val=isFull(s);
	printf("val=%d\n", val);
	printf("===========================\n");

	//清空栈
	makeEmpty(s);
	printf("stack isEmpty:%d\n", isEmpty(s));

	//如果栈不在使用,则释放栈内存
	disposeStack(s);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值