栈和队列

本文深入探讨了数据结构中两种基本类型——栈和队列的原理与应用。详细讲解了栈的后进先出(LIFO)特性及其实现方式,包括压栈、出栈等操作;同时,阐述了队列的先进先出(FIFO)原则,并介绍了其通过数组和链表的不同实现方法。此外,还提供了具体的代码实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈和队列

1.栈

1.1概念:栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵守后进先出LIFO(Last In First Out)的原则

压栈:栈的插入操作叫做进栈、压栈或入栈,插入数据在栈顶

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

1.2栈的实现:栈的实现一般可以使用 数组或链表来实现,相对而言数组的结构实现更好一点。因为数组的尾插的代价更小一点。

下面是我的实现栈的一些接口:

typedef struct Stack {
	int array[100];
	int top;
}	Stack;

// 初始化
void StackInit(Stack *stack) {
	stack->top = 0;
}

// 压栈(尾插)
void StackPush(Stack *stack, int value) {
	stack->array[stack->top] = value;
	stack->top++;
}

// 出栈、弹出(尾删)
void StackPop(Stack *stack) {
	stack->top--;
}

// 返回栈顶元素
int StackTop(const Stack *stack) {
	return stack->array[stack->top - 1];
}

// 判断是否为空
int StackEmpty(const Stack *stack) {
	return stack->top == 0 ? 1 : 0;
}

// 获取 size
int StackSize(const Stack *stack) {
	return stack->top;
}


// 1. 括号匹配
bool isValid(char* s) {
	Stack	stack;
	StackInit(&stack);
	
	while (*s != '\0') {
		switch (*s) {
		case '{':
		case '[':
		case '(':
			StackPush(&stack, (int)*s);
			break;
		case '}':
		case ']':
		case ')': {
					  if (StackEmpty(&stack)) {
						  return false;
					  }

					  char left = (char)StackTop(&stack);
					  StackPop(&stack);
					  if (!(left == '(' && *s == ')'
						  || left == '[' && *s == ']'
						  || left == '{' && *s == '}')) {
						  return false;
					  }
			break;
		}
		default:
			break;
		}

		s++;
	}

	if (!StackEmpty(&stack)) {
		return false;
	}

	return true;
}

2.队列

2.1队列的概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的原则。

入队列:进行插入操作的一端称为 队尾

出队列:进行删除操作的一端称为 队头

2.2队列的实现:队列可以用数组也可以用链表。但是这里使用链表更好一点。因为数组在出队的时候需要移动整个数组,效率低。

下面是我实现队列的一些接口:

typedef struct Node {
	int value;
	struct Node *next;
}	Node;

// 头删 + 尾插
typedef struct Queue {
	Node *front;		// 链表的第一个结点
	Node *rear;			// 链表的最后一个结点
	int size;			// 数据个数
}	Queue;

// 初始化
void QueueInit(Queue *queue) {
	queue->front = NULL;
	queue->rear = NULL;
	queue->size = 0;
}
// 销毁
void QueueDestroy(Queue *queue) {
	Node *node, *next;
	for (node = queue->front; node != NULL; node = next) {
		next = node->next;
		free(node);
	}

	queue->front = queue->rear = NULL;
	queue->size = 0;
}

// Push ,队尾插入,即链表的尾插
void QueuePush(Queue *queue, int val) {
	Node *node = (Node *)malloc(sizeof(Node));
	node->value = val;
	node->next = NULL;
	queue->size++;

	if (queue->rear != NULL) {
		queue->rear->next = node;
		queue->rear = node;
	}
	else {
		queue->front = queue->rear = node;
	}
}

// Pop, 队首出列,即链表的头删
void QueuePop(Queue *queue) {
	assert(queue->size > 0);
	queue->size--;
	Node *front = queue->front;
	queue->front = queue->front->next;
	free(front);

	if (queue->front == NULL) {
		// 处理只有一个结点的情况
		queue->rear = NULL;
	}
}

// Front	返回队首元素
int QueueFront(const Queue *queue) {
	return queue->front->value;
}


// Rear		返回队尾元素
int QueueRear(const Queue *queue) {
	return queue->rear->value;
}
// Empty	是否为空
int QueueEmpty(const Queue *queue) {
	return queue->size == 0 ? 1 : 0;
}
// Size
int QueueEmpty(const Queue *queue) {
	return queue->size;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值