算法小记——栈和队列的思想

本文介绍了队列和栈这两种基本数据结构,队列遵循先进先出(FIFO)原则,常用于购票等场景;栈则遵循后进先出(LIFO)原则,如弹匣中的子弹。文章提供了C++代码示例,展示了如何使用栈解密回文字符串,并提及队列与栈结合的使用方式。
摘要由CSDN通过智能技术生成

队列(queue)是一种先进先出的数据结构

队列是一种特殊的线性结构,它只允许删除队列的首部(head),这称为“出队”,当插入元素时,只能在队列的尾部(tail)进行操作,这称为“入队”。当队列中没有元素时(即 head==tail),称为“空队列”。在我们的日常生活中有很多情况都符合队列的特性。比如买票, 我们可以把每个排队买票的窗口当成一个队列。在这个队列当中,来得越早的人越靠前,也就越早能买到票,就是先来的人先服务我们称为“先进先出”(First In First Out,FIFO)原则

栈(stack)则是一种后进先出的数据结构。(堆栈最早是艾伦·图灵于1946提出)

如弹匣最后压进去的那一颗子弹是最先发射出去的。

栈不仅仅是一种算法,它代表的是一种思想。可以struck栈,也可以把栈的思想与其他算法结合起来获得更加简洁的代码。

栈的头文件为#include<stack>

定义栈

如:

struct stack

{

Int XXX;

}

struck queue q1 …;

栈有以下的常用操作:

q.push(x);        //将x压入栈顶

q.top();        //返回栈顶的元素

q.pop();       //删除栈顶的元素

q.size();       //返回栈中元素的个数

q.empty();        //检查栈是否为空,若为空返回true,否则为false

当确定栈结构后,每次运用栈中的词都需要读取号。如上方的q.XXX()

我们可以用栈的特性来解密回文(代码如下):

#include<bits/stdc++.h>

using namespace std;
int main()
{
	char a[101],s[101];
	int i,len,mid,next,top;
	
	gets(a);//读入一行字符串
	
	/*在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数.
	gets() 比 scanf 简洁,就算输入的字符串中有空格也可以直接输入*/
	
	len=strlen(a);//求字符串长度
	mid=len/2-1;//求字符串的中点
	
	top=0;//初始化栈
	//将mid前的字符依次入栈
	for(i=0;i<=mid;i++)
	s[++top]=a[i];
	

	//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
	if(len%2==0)
	next=mid+1;
	else
	next=mid+2;
	

	//开始匹配
	for(i=next;i<=len-1;i++)
	{
	if(a[i]!=s[top])
	break;
	top--;
	}

	//如果top的值为0,则说明栈内所以的字符都被一一匹配了
	if(top==0)
	cout<<"YES";
	else
	cout<<"NO";
 } 

同时贯彻本文思想,可以把队列与栈结合起来

代码如下(部分):

#include<bits/stdc++.h>

using namespace std; 
struct queue
{
    int data[1000];
    int head;
    int tail;
};

struct stack
{
    int data[10];
    int top;
};

int main()
{
    struct queue q1,q2;
    struct stack s;
    int book[10];
    int i,t;


//初始化队列
q1.head=1; q1.tail=1;
q2.head=1; q1.tail=1;
//初始化栈
s.top=0;
}

其中struct queue 为定义队列数据结构体

head 用来存储队头,tail 用来存储队尾,data用来存储队列元素。

而struct stack 为定义栈

top用来存储栈顶,data用来存储栈元素。

下面的代码:

 struct queue q1,q2;

    struct stack s;

q1 q2是定义队列变量,s是栈变量

后面的

q1.head=1; q1.tail=1;
q2.head=1; q1.tail=1;

s.top=0;

则是读取队列变量元素以及栈变量元素的格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值