C语言实现堆栈和队列
堆栈实现(顺序结构)
base称为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。
top称为栈顶指针,其初值指向栈底,即top=base可作为栈空的标记。每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

定义堆栈
#define stack_maxSize 100    // 存储空间初始分配量
#define stack_increment 10    // 存储空间分配增量
typedef struct
{
	int* base;    // 栈底
	int* top;    // 栈顶
	int stackMaxSize;    // 当前已分配地存储空间
}SqStack;
初始化堆栈
/*创建堆栈*/
void Inistack(SqStack& S)
{
	S.base = (int*)malloc(stack_maxSize * sizeof(int));    // 分配空间
	if (!S.base)
		exit(0);
	S.top = S.base;
	S.stackMaxSize = stack_maxSize;
}
判断堆栈是否为空
/*判断堆栈是否为空*/
int isStackEmpty(SqStack S)
{
	if (S.base == S.top)
		return 0;
	else
		return 1;
}
取栈顶元素
/*取栈顶元素*/
int getTop(SqStack S)
{
	/*判断非空*/
	if (!isStackEmpty(S))
		return 0;
	return *(S.top - 1);
}
压入堆栈
/*压入堆栈*/
void push_Stack(SqStack& S, int e)
{
	if (S.top - S.base >= S.stackMaxSize)
	{
		int* temp = (int*)realloc(S.base, (S.stackMaxSize + stack_increment) * sizeof(int));
		if (!temp)
			exit(0);
		S.base = temp;
		S.top = S.base + S.stackMaxSize;
		S.base += stack_increment;
	}
	*S.top++ = e;
}
弹出栈顶元素
/*弹出栈顶元素*/
int pop_stack(SqStack& S)
{
	int temp;
	if (!isStackEmpty(S))
		return 0;
	temp = *--S.top;
	return temp;
}
清空栈元素,不释放空间
/*清空堆栈元素,不释放空间*/
void clear_stack(SqStack& S)
{
	if (!isStackEmpty(S))
		return ;
	S.top = S.base;
	printf("清空完成!\n");
}
打印堆栈内容
/*打印堆栈内容*/
void show_stack(SqStack S)
{
	if (!isStackEmpty(S))
		return;
	while (S.top != S.base)
	{
		printf("%d\t", *--S.top);
	}
	printf("\n");
}
返回堆栈元素个数
/*返回堆栈元素个数*/
int show_NumOfStack(SqStack S)
{
	return (S.top - S.base);
}
销毁堆栈,释放空间
/*销毁堆栈,释放空间*/
void destroy_stack(SqStack& S)
{
	if (S.base)
	{
		free(S.base);
		S.base = S.top = NULL;
		printf("销毁成功!\n");
	}
	else
		printf("销毁失败!\n");
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define stack_maxSize 100
#define stack_increment 10
typedef struct
{
	int* base;
	int* top;
	int stackMaxSize;
}SqStack;
/*创建堆栈*/
void Inistack(SqStack& S)
{
	S.base = (int*)malloc(stack_maxSize * sizeof(int));
	if (!S.base)
		exit(0);
	S.top = S.base;
	S.stackMaxSize = stack_maxSize;
}
/*判断堆栈是否为空*/
int isStackEmpty(SqStack S)
{
	if (S.base == S.top)
		return 0;
	else
		return 1;
}
/*取栈顶元素*/
int getTop(SqStack S)
{
	/*判断非空*/
	if (!isStackEmpty(S))
		return 0;
	return *(S.top - 1);
}
/*压入堆栈*/
void push_Stack(SqStack& S, int e)
{
	if (S.top - S.base >= S.stackMaxSize)
	{
		int* temp = (int*)realloc(S.base, (S.stackMaxSize + stack_increment) * sizeof(int));
		if (!temp)
			exit(0);
		S.base = temp;
		S.top = S.base + S.stackMaxSize;
		S.base += stack_increment;
	}
	*S.top++ = e;
}
/*弹出栈顶元素*/
int pop_stack(SqStack& S)
{
	int temp;
	if (!isStackEmpty(S))
		return 0;
	temp = *--S.top;
	return temp;
}
/*清空堆栈元素,不释放空间*/
void clear_stack(SqStack& S)
{
	if (!isStackEmpty(S))
		return ;
	S.top = S.base;
	printf("清空完成!\n");
}
/*打印堆栈内容*/
void show_stack(SqStack S)
{
	if (!isStackEmpty(S))
		return;
	while (S.top != S.base)
	{
		printf("%d\t", *--S.top);
	}
	printf("\n");
}
/*返回堆栈元素个数*/
int show_NumOfStack(SqStack S)
{
	return (S.top - S.base);
}
/*销毁堆栈,释放空间*/
void destroy_stack(SqStack& S)
{
	if (S.base)
	{
		free(S.base);
		S.base = S.top = NULL;
		printf("销毁成功!\n");
	}
	else
		printf("销毁失败!\n");
}
int main()
{
	SqStack myStack;
	Inistack(myStack);
	for (int i = 0; i < 10; i++)
	{
		push_Stack(myStack, i);
	}
	show_stack(myStack);
	for (int i = 0; i < 10; i++)
	{
		push_Stack(myStack, i);
	}
	show_stack(myStack);
	destroy_stack(myStack);
	show_stack(myStack);
	return 0;
}
堆栈实现(链式结构)
定义
typedef struct StackNode
{
	int data;
	struct StackNode* next;
}StackNode, *LinkStack;
初始化
/*初始化*/
void InitStack(LinkStack& S)
{
	S = NULL;
}
判断非空
/*判断是否为空*/
int isEmpty(LinkStack S)
{
	if (S == NULL)
		return 0;
	return 1;
}
进栈
/*进栈*/
void pushStack(LinkStack& S, int x)
{
	StackNode* p = new StackNode;
	p->data = x;
	p->next = S;
	S = p;
}
出栈
/*出栈*/
int popStack(LinkStack& S)
{
	if (!isEmpty(S))
		exit(0);
	StackNode* p = new StackNode;
	int x = S->data;
	p = S;
	S = S->next;
	delete p;
	return x;
}
取栈顶元素
/*取栈顶元素*/
int getTop(LinkStack S)
{
	if (!isEmpty(S))
		exit(0);
	return S->data;
}
打印
/*打印*/
void showStack(LinkStack S)
{
	if (!isEmpty(S))
		exit(0);
	StackNode* p = new StackNode;
	p = S;
	while (p != NULL)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct StackNode
{
	int data;
	struct StackNode* next;
}StackNode, *LinkStack;
/*初始化*/
void InitStack(LinkStack& S)
{
	S = NULL;
}
/*判断是否为空*/
int isEmpty(LinkStack S)
{
	if (S == NULL)
		return 0;
	return 1;
}
/*进栈*/
void pushStack(LinkStack& S, int x)
{
	StackNode* p = new StackNode;
	p->data = x;
	p->next = S;
	S = p;
}
/*出栈*/
int popStack(LinkStack& S)
{
	if (!isEmpty(S))
		exit(0);
	StackNode* p = new StackNode;
	int x = S->data;
	p = S;
	S = S->next;
	delete p;
	return x;
}
/*取栈顶元素*/
int getTop(LinkStack S)
{
	if (!isEmpty(S))
		exit(0);
	return S->data;
}
/*打印*/
void showStack(LinkStack S)
{
	if (!isEmpty(S))
		exit(0);
	StackNode* p = new StackNode;
	p = S;
	while (p != NULL)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}
int main()
{
	LinkStack S;
	InitStack(S);
	for (int i = 0; i < 10; i++)
	{
		pushStack(S, i);
	}
	showStack(S);
	printf("%d\n", popStack(S));
	showStack(S);
	return 0;
}
队列实现(顺序结构)
循环队列

定义队列
#define mSize 5
typedef struct queue
{
	int front;    // 队头元素的前一单元的位置下标
	int rear;     // 队尾元素的位置下标
	int maxSize;  // 队列空间的最大容量
	int* element; // 队列元素的数组首地址
}Queue;
初始化队列
/*创建队列*/
void initQueue(Queue& Q)
{
	Q.maxSize = mSize;
	Q.element = (int*)malloc(sizeof(int) * mSize);
	Q.front = Q.rear = 0;
}
销毁队列,释放空间
/*销毁队列,释放空间*/
void destroy_Queue(Queue& Q)
{
	free(Q.element);
	Q.maxSize = -1;
	Q.front = Q.rear = -1;
}
清除队列
/*清除队列*/
void clear_queue(Queue& Q)
{
	Q.front = Q.rear = 0;
}
判断非空
/*判断非空*/
int isQueueEmpty(Queue Q)
{
	return Q.front == Q.rear;
}
判断已满
/*判断已满*/
int isQueueFull(Queue Q)
{
	return ((Q.rear + 1) % Q.maxSize == Q.front);
}
获取队头元素
/*获取队头元素*/
void getFront(Queue Q)
{
	if (isQueueEmpty(Q))
		exit(0);
	printf("%d\n", Q.element[(Q.front + 1) % Q.maxSize]);
}
队尾插入
/*队尾插入*/
void enQueueRear(Queue& Q, int temp)
{
	if (isQueueFull(Q))
		exit(0);
	Q.rear = (Q.rear + 1) % Q.maxSize;
	Q.element[Q.rear] = temp;
}
队头删除
/*队头删除*/
void deQueueFront(Queue& Q)
{
	if (isQueueEmpty(Q))
		exit(0);
	Q.front = (Q.front + 1) % Q.maxSize;
}
打印队列
/*打印队列*/
void show_Queue(Queue Q)
{
	int p = Q.front;
	while (p != Q.rear)
	{
		printf("%d\t", Q.element[++p]);
	}
	printf("\n");
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define mSize 5
typedef struct queue
{
	int front;
	int rear;
	int maxSize;
	int* element;
}Queue;
/*创建队列*/
void initQueue(Queue& Q)
{
	Q.maxSize = mSize;
	Q.element = (int*)malloc(sizeof(int) * mSize);
	Q.front = Q.rear = 0;
}
/*销毁队列,释放空间*/
void destroy_Queue(Queue& Q)
{
	free(Q.element);
	Q.maxSize = -1;
	Q.front = Q.rear = -1;
}
/*清除队列*/
void clear_queue(Queue& Q)
{
	Q.front = Q.rear = 0;
}
/*判断非空*/
int isQueueEmpty(Queue Q)
{
	return Q.front == Q.rear;
}
/*判断已满*/
int isQueueFull(Queue Q)
{
	return ((Q.rear + 1) % Q.maxSize == Q.front);
}
/*获取队头元素*/
void getFront(Queue Q)
{
	if (isQueueEmpty(Q))
		exit(0);
	printf("%d\n", Q.element[(Q.front + 1) % Q.maxSize]);
}
/*队尾插入*/
void enQueueRear(Queue& Q, int temp)
{
	if (isQueueFull(Q))
		exit(0);
	Q.rear = (Q.rear + 1) % Q.maxSize;
	Q.element[Q.rear] = temp;
}
/*队头删除*/
void deQueueFront(Queue& Q)
{
	if (isQueueEmpty(Q))
		exit(0);
	Q.front = (Q.front + 1) % Q.maxSize;
}
/*打印队列*/
void show_Queue(Queue Q)
{
	int p = Q.front;
	while (p != Q.rear)
	{
		printf("%d\t", Q.element[++p]);
	}
	printf("\n");
}
int main()
{
	Queue myQueue;
	initQueue(myQueue);
	for (int i = 0; i < 4; i++)
	{
		enQueueRear(myQueue, i);
	}
	show_Queue(myQueue);
	destroy_Queue(myQueue);
	show_Queue(myQueue);
	return 0;
}
队列实现(链式结构)
定义
typedef struct QNode
{
	int data;
	struct QNode* next;
}QNode, *QueuePtr;
typedef struct
{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
初始化
/*初始化*/
void InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	if (!Q.front)
		exit(0);
	Q.front->next = NULL;
}
判断是否为空
/*判断是否为空*/
int isEmpty(LinkQueue Q)
{
	return (Q.front == Q.rear);
}
销毁
/*销毁*/
void destroyQueue(LinkQueue& Q)
{
	if (isEmpty(Q))
		exit(0);
	while (Q.front)
	{
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
}
取队头元素
/*取队头元素*/
int getFront(LinkQueue Q)
{
	if (isEmpty(Q))
		exit(0);
	return Q.front->next->data;
}
入队
/*入队*/
void enQueue(LinkQueue& Q, int x)
{
	QNode* p = (QueuePtr)malloc(sizeof(QNode));
	if (!p)
		exit(0);
	p->data = x;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
}
出队
/*出队*/
int deQueue(LinkQueue& Q)
{
	if (isEmpty(Q))
		exit(0);
	QNode* p = (QueuePtr)malloc(sizeof(QNode));
	p = Q.front->next;
	int x = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)
		Q.rear = Q.front;
	free(p);
	return x;
}
打印
/*打印*/
void show_Queue(LinkQueue Q)
{
	if (isEmpty(Q))
		exit(0);
	QNode* p = (QueuePtr)malloc(sizeof(QNode));
	p = Q.front->next;
	while (p != NULL)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct QNode
{
	int data;
	struct QNode* next;
}QNode, *QueuePtr;
typedef struct
{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
/*初始化*/
void InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	if (!Q.front)
		exit(0);
	Q.front->next = NULL;
}
/*判断是否为空*/
int isEmpty(LinkQueue Q)
{
	return (Q.front == Q.rear);
}
/*销毁*/
void destroyQueue(LinkQueue& Q)
{
	if (isEmpty(Q))
		exit(0);
	while (Q.front)
	{
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
}
/*取队头元素*/
int getFront(LinkQueue Q)
{
	if (isEmpty(Q))
		exit(0);
	return Q.front->next->data;
}
/*入队*/
void enQueue(LinkQueue& Q, int x)
{
	QNode* p = (QueuePtr)malloc(sizeof(QNode));
	if (!p)
		exit(0);
	p->data = x;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
}
/*出队*/
int deQueue(LinkQueue& Q)
{
	if (isEmpty(Q))
		exit(0);
	QNode* p = (QueuePtr)malloc(sizeof(QNode));
	p = Q.front->next;
	int x = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)
		Q.rear = Q.front;
	free(p);
	return x;
}
/*打印*/
void show_Queue(LinkQueue Q)
{
	if (isEmpty(Q))
		exit(0);
	QNode* p = (QueuePtr)malloc(sizeof(QNode));
	p = Q.front->next;
	while (p != NULL)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}
int main()
{
	LinkQueue Q;
	InitQueue(Q);
	for (int i = 0; i < 10; i++)
	{
		enQueue(Q, i);
	}
	show_Queue(Q);
	printf("%d\n", deQueue(Q));
	show_Queue(Q);
	return 0;
}