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);
}
}