栈和队列

目录

栈一、栈的基本概念1、栈的定义栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。

2、栈的常见基本操作

1.题目:验证栈序列

1.队列的定义

2.函数运用示例

3.1.题目示例:



一、栈的基本概念
1、栈的定义
栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。

栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。

栈又称为后进先出(Last In First Out)的线性表,即后面进来的元素先出去,简称LIFO结构

2、栈的常见基本操作


InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空,若栈为空则返回true 1,否则返回false 0。
Push(&S, x):进栈(栈的插入操作),若栈S未满,则将x加入使之成为新栈顶。
Pop(&S, &x):出栈(栈的删除操作),若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素,若栈S非空,则用x返回栈顶元素。
DestroyStack(&S):栈销毁,并释放S占用的存储空间(“&”表示引用调用)。
二、栈的顺序存储结构
1、栈的顺序存储
采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
若存储栈的长度为StackSize,则栈顶位置top必须小于StackSize。当栈存在一个元素时,top等于0,因此通常把空栈的判断条件定位top等于-1。

若现在有一个栈,StackSize是5,则栈的普通情况、空栈、满栈的情况分别如下图所示:

来道题目让你能够更直观地了解栈

1.题目:验证栈序列

输入:

2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3

输出:

Yes
No

代码:

#include<stdio.h>               //栈
int k=0,s=1;
int a[100001],b[100001],zhan[1000001];
int main() {
	int n;
	scanf("%d",&n);
	while(n--) {
		int m;
		scanf("%d",&m);
		for(int i=1; i<=m; i++)
			scanf("%d",&a[i]);
		for(int i=1; i<=m; i++)
			scanf("%d",&b[i]);
		for(int i=1; i<=m; i++) {
			zhan[++k]=a[i];
			while(zhan[k]==b[s]&&zhan[k]&&b[s]) {
				k--;
				s++;
			}
		}
		if(k!=0)
			printf("No");
		else
			printf("Yes");
		if(n!=0)
			printf("\n");
		k=0,s=1;
	}
	return 0;
}
1.队列的定义

在了解队列前,我们还需要了解一下线性表,线性表:是具有相同数据类型的n个数据元素的有限序列,其中n为表长,当n等于0的时候说明这个线性表是一个空表,是只允许在一端进行插入和删除的线性表,而且使用的时候要定义专属头文件#include<queue>或者c++中的万能头文件#include<bits/stdc++.h>;

队列定义:是只允许在一端进行插入,在另一端删除的线性表;

F从队尾插进队列,A从队头从队列中删除

有关队列的重要术语:队头,队尾,空队列

队头:允许删除元素的一端

队尾:允许插入的一端

空队列:队列里面没有元素

队列的特点:先进先出(FIFO)

队列常用函数:

  1. push() 在队尾插入一个元素
  2. pop() 删除队列第一个元素
  3. size() 返回队列中元素个数
  4. empty() 如果队列空则返回true
  5. front() 返回队列中的第一个元素
  6. back() 返回队列中最后一个元素
2.函数运用示例

1:push()在队尾插入一个元素

queue <string> q;
q.push("first");
q.push("second");
cout<<q.front()<<endl;

输出 first

2:pop() 将队列中最靠前位置的元素删除,没有返回值

queue <string> q;
q.push("first");
q.push("second");
q.pop();
cout<<q.front()<<endl;

输出2,因为队列中有两个元素

3:size() 返回队列中元素个数

queue <string> q;
q.push("first");
q.push("second");
cout<<q.size()<<endl;

分别输出1和0
最开始队列为空,返回值为1(ture);
插入两个元素后,队列不为空,返回值为0(false);

5:front() 返回队列中的第一个元素

queue <string> q;
q.push("first");
q.push("second");
cout<<q.front()<<endl;
q.pop();
cout<<q.front()<<endl;

第一行输出first;
第二行输出second,因为pop()已经将first删除了

6:back() 返回队列中最后一个元素

queue <string> q;
q.push("first");
q.push("second");
cout<<q.back()<<endl;

输出最后一个元素second

3.1.题目示例:

小结:诛天神魔

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值