c语言底层数组的方式实现栈和队列

c语言底层用双向链表的方式实现栈和队列比较容易,这里分享下c语言底层数组的方式实现栈和队列,栈结构的实现比较简单,队列的实现可以巧妙的利用一个size记录队列的有效大小和两个入队出队位置变量,另外还有一个跳转下一个有效位置函数比较巧妙,代码如下:

#include<stdio.h>
#include<stdlib.h>
#define stacksizelimit 10  //实现栈的数组固定长度 
#define queuesizelimit 10  //实现队列的数组固定长度 
typedef char elementtype;  //定义进栈和进队列数据类型 
elementtype stack[stacksizelimit];  //申请一个全局类型数组作为实现栈结构的底层 
elementtype queue[queuesizelimit];  //申请一个全局类型数组作为实现队列结构的底层 
int stacksize=0;//记录栈的有效元素个数 
int queuesize=0;//记录队列的有效元素个数 
int queuepushindex=0;//队列当前入队的位置 
int queuepollindex=0;//队列当前出队的位置 
void stackpush(elementtype x,elementtype stack[]);//入栈函数 
void stackpoll(elementtype stack[]);//出栈函数 
void queuepush(elementtype x,elementtype queue[]);//入队函数 
void queuepoll(elementtype queue[]);//出队函数 
int nextindex(int index);//队列函数里下一个入队/出队位置函数 


void stackpush(elementtype x,elementtype stack[]) {
	if(stacksize>=stacksizelimit) {//如果栈的有效元素个数大于等于了底层数组的极限,就无法入栈了 
		printf("stack is full\n");
		return;
	}
	stack[stacksize++]=x;//走到这一步就表明栈内一定还有空间,所以把元素放到当前空位上,并且栈的有效元素个数进行++操作 
}

void stackpoll(elementtype stack[]) {
	if(stacksize==0)	{//如果栈的有效元素个数为0,表面栈是空栈,无法弹出元素 
		printf("stack is empty\n");
		return;
	}
	printf("%c\n",stack[--stacksize]);//走到这一步表明站内有元素,stacksize先自减一之后然后再弹出栈顶有效元素 
}


void queuepush(elementtype x,elementtype queue[]) {
	if(queuesize>=queuesizelimit) {//如果队列有效元素大于等于队列底层数组的极限,表面无法再入队了 
		printf("queue is full\n");
		return;
	}
	queue[queuepushindex]=x;//走到一步,表面可以有空间入队,直接把元素放到入队位置 
	queuepushindex=nextindex(queuepushindex);//入队位置跳转到下一个空位置 
	queuesize++;//别忘记把队列大小进行加一的调整 
}

void queuepoll(elementtype queue[]) {
	if(queuesize==0) {//如果队列大小为0,表明没有元素可以弹出 
		printf("queue is empty\n");
		return;
	}
	printf("%c\n",queue[queuepollindex]);//走到这一步表明可以弹出队列元素 
	queuepollindex=nextindex(queuepollindex);//队列元素下标进行下一个跳转 
	queuesize--;//别忘了给队列大小进行减一的操作 
}



int nextindex(int index) {
	if(index<queuesizelimit-1) {//中了这个if表面还没走到底,所以直接进行加一操作就行了 
		return ++index;
	} else //走到这里说明已经来到了数组最后一个有效位,下一步当然是回到数组首元素位置进行循环操作拉 
		return 0;
}


int main() {//分别进行打印测试 
	char i='a';
	for(i='a'; i<='a'+queuesizelimit; i++) {//特意让入队元素个数超过有效大小,看看是否按照预期的处理 
     queuepush(i,queue);
	}

	for(i='a'; i<='a'+queuesizelimit; i++) {//特意让出队元素个数超过有效大小,看看是否按照预期的处理 
     queuepoll(queue);
	}

	for(i='a'; i<='a'+stacksizelimit; i++) {//特意让入栈元素个数超过有效大小,看看是否按照预期的处理 
     stackpush(i,stack);
	}

	for(i='a'; i<='a'+stacksizelimit; i++) {//特意让出栈元素个数超过有效大小,看看是否按照预期的处理 
     stackpoll(stack);
	}

}



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mathhater

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

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

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

打赏作者

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

抵扣说明:

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

余额充值