栈和队列知识点总结

本文详细介绍了栈和队列这两种基本线性数据结构的概念,包括栈的先进后出原则和队列的先进先出特性。还涵盖了栈和队列在括号匹配、顺序队列、循环队列及双端队列中的具体应用实例,并提供了C语言实现代码。

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

前言

栈和队列是两种重要的线性结构,从数据结构角度来看,两者其实都是线性表。我们可以用集合的理念去理解三者的关系,栈和队列属于线性表,而两者又是线性表这个大集合的两个不严格独立的两个子集(特殊的双端队列可以看作栈底相邻的两个栈),两者的本质是受限的线性表。

栈的基本概念

栈——一种受限线性表,仅限定在表尾插入和删除。对于栈,表头为栈底,表尾为栈头,每一个元素进入栈都会自动沉底,所以栈遵守着先进后出的原则。同样,栈也有链式存储和顺序存储两个物理结构。

栈的应用

栈最基本的操作是——增、查、删。
入栈:先判栈满,elements[++top] = x;
出栈:先判栈空,x = elements[top—];
判栈空:top=-1;
判栈满:top = maxsize - 1;

括号匹配

//括号匹配的检验程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  MAXLEN 50
typedef struct stack 
{
	char ch[50];
	int top;
}ST;
//栈的初始化
ST *ST_Init()
{
	ST *st;
	if (st=(ST *)malloc(sizeof(ST)))
	{
		st->top=0;
		return st;
	}
	return NULL;
}
//出栈操作
int ST_Pop(ST *st)
{
	if (st->top==0)
	{
		printf("栈为空\n");
		return 0;
	}
	st->top--;
	return st->ch[st->top];
}
 
//入栈操作
void st_Push(ST *st,char c)
{
	if (st->top==MAXLEN)
	{
		printf("栈溢出\n");
		return ;
	}
	st->ch[st->top]=c;
	st->top++;
}
//符号检验函数
void check_symbol(ST *st,char *a)
{
	int i;
	st_Push(st,a[0]);
 
	for (i=1;i<strlen(a);i++)
	{
		//遍历每一个元素,判断出栈还是入栈
		if ((a[i]==']'&&st->ch[st->top-1]=='[')||(a[i]==')'&&st->ch[st->top-1]=='('))//出栈的条件
		{
			ST_Pop(st);
		}
		else
		{
			st_Push(st,a[i]);
		}
	}
	if(st->top==0)
	{
		printf("括号是匹配的\n\n");
	}
	else
 
	{
		printf("括号不匹配\n\n");
	}
}
 
int main()
{
 
	while (1)
	{
		char s[50];
		ST *st;
		st=ST_Init();	
		printf("请输入一串括号:\n");
		scanf("%s",s);
		if(s[0]=='E')
			return 0;
		check_symbol(st,s);
	}
 return 0;
}

队列的基本概念

队列——一种受限线性表,仅限定在表一端插入,另一端删除。队列遵守着先进先出的原则。同样,队列也有链式存储和顺序存储两个物理结构。

队列的应用

队列最基本的操作是——增、查、删。

顺序队列

入队:q[rear++] = x;
出队:x = q[front++]
判队空:front == rear;
判队满:front - rear = maxsize

循环队列

队空:front == rear
队满:(rear+1)%maxsize == front

双端队列

一端允许插入和删除,一端只允许删除。

### 数据结构中的队列 #### 的概念与特性 是一种遵循后进先出(LIFO, Last In First Out)原则的线性数据结构。这意味着最后被压入的元素会最先弹出[^1]。通常支持两个基本操作:`push` `pop`,分别用于向顶添加元素以及移除顶元素。 以下是的一个简单实现示例: ```python class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() def is_empty(self): return len(self.items) == 0 def peek(self): if not self.is_empty(): return self.items[-1] def size(self): return len(self.items) ``` #### 队列的概念与特性 队列则是一种先进先出(FIFO, First In First Out)的数据结构。最早进入队列的元素会被优先处理。队列的主要操作包括 `enqueue` `dequeue`,前者用来在队尾插入新元素,后者用来从队首移除元素。 下面是一个基于列表实现的队列例子: ```python class Queue: def __init__(self): self.items = [] def enqueue(self, item): self.items.append(item) def dequeue(self): if not self.is_empty(): return self.items.pop(0) def is_empty(self): return len(self.items) == 0 def front(self): if not self.is_empty(): return self.items[0] def size(self): return len(self.items) ``` #### 双端队列的特点 双端队列(Deque)结合了队列的功能,允许在一端或两端执行插入删除操作[^2]。这种灵活性使得双端队列成为一种非常强大的工具,在许多算法场景下都能发挥重要作用。 #### 存储方式 无论是还是队列,它们都可以通过顺序存储或者链式存储的方式来实现。对于顺序存储而言,通常是利用数组作为底层容器;而链式存储则是借助指针连接各个节点形成链条状结构[^3]。 需要注意的是,尽管队列属于线性表范畴,但由于其特定的操作约束条件限制了随机访问能力——也就是说无法像普通线性表那样随意获取其中间位置上的任意元素。 #### 应用领域 - **的应用**: 表达式求值、括号匹配检测、函数调用管理等。 - **队列的应用**: 打印任务调度、广度优先搜索(BFS)、银行排队系统模拟等问题解决过程中经常需要用到队列机制。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值