无中生有之突击NOIP(2)--栈,队列,链表

本文深入介绍了数据结构中的栈、队列和链表。详细讲解了它们的定义、理解及实现代码,还探讨了在解决实际问题中的应用,如广度优先搜索和判断回文。同时,提到了链表的插入操作及其相对于数组的灵活性,并提供了模拟链表的实现方式。

1、队列

定义:形如我们排队买票,第一个站队的人第一个买票一样,一个可以控制变量先进先出的结构体里,我们称之为队列。

理解:我们可以想象出一排东西整齐存放于一行里,我们要做的是用一个可以压缩的框框,通过从前到后移动,来决定我们框住的值到底为多少。

实现代码如下:

#include<stdio.h>
#include<algorithm>
int main(){
    int q[102]={
  
  0,6,3,1,7,5,8,9,2,4},head,tail;
    head=1;
    tail=10;//队列初始化
    while(head<tail)
    {
        cout<<q[head];
        head++;
        q[tail]=q[head];
        tail++;
        head++;
    }
    getchar();getchar();
    return 0;
}

总结:队列属于一种特殊的线性结构,它只允许在队列首部删除,队列尾部插入,称为入队。当队列中没有元素的时候,我们称之为空队列。队列将作为我们今后广度优先搜索(BFS)和队列优化的Bellman-Ford最短路算法的核心数据。

P.S.我们可以将队列定义为一个结构体,即一共两个变量一个数组的结构。
e.g.`
struct queue
{
int data[100];//队列的主体,
int head;//队首
int tail;//队尾
};
//上面是结构体的定义,下面定义一个名为q的结构体
struct queue q;
q.head=1;
q.tail=1;
cin>>q.data[q.tail];

2、栈

定义:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

理解:例如汉诺塔,我们把123号塔依次放入,若要移出1号塔,首先要移出3号塔,然后是2号。说白了就是一个后进先出的数据结构,我们只能在一端进行操作。可以判断回文,数据如下:

#include<stdio.h>;
#include<string.h>;
#include<algorithm>;
int main(){
    char a[101],s[101];
    int i,len,mid,next,top;
    gets(a);//读入一串字符串
    len=strlen(a);//求字符串的长度
    mid=len/2-1;//寻找中点
    top=0;//栈初始化
    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--;
    }
    if(top==0)//如果top的值为0;则说明栈内的字符都被匹配过了
        cout<<"yes";
        else cout<<"NO";
        getchar():getchar();
        return 0;
    }

总结使用:大家可以尝试做做此题:

问题描述:

 小哼和小哈在玩一个比较奇怪的扑克游戏——小猫钓鱼。游戏规则:将一副扑克牌平均分成两份,没人拿一分。小哼先拿出手中第一张扑克牌放在桌上,然后小哈也拿出手中第一张扑克牌,并放在小哼刚才打出的扑克牌的上面,两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部拿走,并依次放到自己手中牌的末尾。当任意一人手中当牌出完时,游戏结束,对方获胜。

分析:

1、这个游戏一共有两种操作:出牌和赢牌。

                                             出牌即出队,赢牌即入队。
</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值