【数据结构每日一题】栈——中心对称链

news/2025/2/12 3:49:30/

[数据结构习题]栈——中心对称链



👉知识点导航💎:【数据结构】栈和队列

👉[王道数据结构]习题导航💎: p a g e 70.4 page70.4 page70.4

本节为栈和链表综合练习题

在这里插入图片描述



题目描述:

在这里插入图片描述



🎇思路:前段进栈

🔱思路分析:

要判断一个带头结点的单链表是否中心对称,即链表的前半部分和后半部分互为逆序关系,因此,由栈的先进后出特性可以实现逆序


step:

因为涉及链表和栈,我们需要分别实现相关的操作:

1. 单链表实现

①定义结构体:

typedef struct LNode { //定义一个单链表char data;struct LNode* next;
}LNode,*LinkList;

②初始化:

void InitList(LinkList& L, int n) {L = (LNode*)malloc(sizeof(LNode)); //头结点LNode* p = L;char x;for (int i = 0; i < n; i++) {cin >> x;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = x;p->next = s;p = s;}p->next = NULL;
}

2. 顺序栈实现

①定义结构体

我们选择用顺序栈来实现

其中 d a t a data data 为字符串数组, t o p top top 为栈顶指针

#define Maxsize 50typedef struct SqStack { //定义一个栈char data[Maxsize];int top;
}SqStack;

②初始化&判空

由于 S . t o p S.top S.top 指向的是栈顶元素,而当栈空时: S . t o p = − 1 S.top=-1 S.top=1,以此来实现初始化与判空

void InitStack(SqStack& S) {S.top = -1; //初始化栈顶
}bool Empty(SqStack& S) {if (S.top == -1)return true;return false;
}

3. 中心对称链的判断

做完了前期准备之后,我们就要判断链是否中心对称了

算法思想:使用栈来判断链表中的数据元素是否中心对称,首先,让单链表的前半段元素放入栈中,在处理链表的后半段元素时,每访问链表的一个元素,就让栈弹出栈顶元素与之进行比较,若相等,则继续判断后续元素,直到链表后半段的元素全部比较完成,此时,若栈为空,则为中心对称链;否则,不成立


图解算法:
在这里插入图片描述

①前段元素进栈

由于已知链表的长度为 n n n,因此,只需要遍历 ⌊ n 2 ⌋ ⌊\frac{n}{2}⌋ 2n 次即遍历完成前半段所有元素

指针 p p p 最初指向首结点,每访问到一个链表结点,便将其压入栈中:S.data[++S.top]=p->data

代码实现:

    LNode* p = L->next;for (int i = 0; i < n / 2; i++) {S.data[++S.top] = p->data; //压入栈p = p->next;}

结束时,如果链表长度 n n n 为偶数,则指针 p p p 直接指向后半段的首结点;若链表长度为奇数,则指向中心结点,此时需要让:p=p->next

if (n % 2 != 0) //如果n为奇数p = p->next; //让p指向后半段首位置

②前段元素出栈

当前状态为:

在这里插入图片描述

不断比较 S.data[S.top]p->next 直到 p = = N U L L p==NULL p==NULL,如果此时栈为空且指针 p p p指向 N U L L NULL NULL,则说明中心对称

防止中间存在元素不相等而提前退出


代码实现:

    while (p != NULL && p->data == S.data[S.top]) {S.top-=1;p = p->next;}if (Empty(S) && p==NULL)return true;elsereturn false;

完整代码实现;

#include<iostream>
#define Maxsize 50
using namespace std;typedef struct LNode { //定义一个单链表char data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L, int n) {L = (LNode*)malloc(sizeof(LNode)); //头结点LNode* p = L;char x;for (int i = 0; i < n; i++) {cin >> x;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = x;p->next = s;p = s;}p->next = NULL;
}typedef struct SqStack { //定义一个栈char data[Maxsize];int top;
}SqStack;void InitStack(SqStack& S) {S.top = -1; //初始化栈顶
}bool Empty(SqStack& S) {if (S.top == -1)return true;return false;
}//判断链表是否中心对称
bool res(LinkList &L, SqStack &S, int n) {LNode* p = L->next;for (int i = 0; i < n / 2; i++) {S.data[++S.top] = p->data; //压入栈p = p->next;}if (n % 2 != 0) //如果n为奇数p = p->next; //让p指向后半段首位置while (p != NULL && p->data == S.data[S.top]) {S.top-=1;p = p->next;}if (Empty(S) && p==NULL)return true;elsereturn false;
}int main() {// 1.定义一个单链表LinkList L;int n;cout << "请输入链表的长度:" << endl;cin >> n;cout << "请输入单链表中的字符:" << endl;InitList(L,n);// 2.定义一个栈SqStack S;InitStack(S);// 3.中心对称字符串cout << "单链表是否中心对称(0/1):" << res(L, S, n) << endl;system("pause");return 0;
}

输出结果:

在这里插入图片描述



🎇这是一道栈和链表的综合练习题,不是很难,但有利于知识点的回顾~🎇

如有错误,欢迎指正~!

在这里插入图片描述


http://www.ppmy.cn/news/260105.html

相关文章

网页美工UI设计

1. 设计概念 2. UI设计中常见的名词 3. UI分类 网页界面 手持设别界面 手持设备界面 平板电脑、电脑系统、应用软件系统、游戏界面等 智能电视界面等 医疗设备及各种数码机床 卡拉OK点歌、远程设备等 4. 图标设计 图标分类 从造型方面分类 硬件图标设计和软件图标设计 …

java软件前端开发_前端的编程软件哪些比较好用?

推荐8款最好用的前端开发工具供美工或者前端开发人员使用,当然若你是NB的全栈工程师也可以下载使用。 Web前端开发最常见的编程软件有以下几种: 1、DreamWeaver DreamWeaver是一款老牌前端开发工具,功能强大且组件丰富,作为前端开发的一款利器被广泛使用。DreamWeaver是一款…

平面设计和美工区别在哪

平面设计和美工区别在哪&#xff0c;学平面设计和美工哪个难&#xff0c;平面设计和淘宝美工工作内容相辅相成&#xff0c;淘宝美工和平面设计使用的软件相同&#xff0c;而平面设计则需要更多的想法&#xff0c;理念。平面设计的工作面更广一些&#xff0c;学平面设计可以做淘…

女神节,谈美工和美编

一、美工和美编的不同&#xff1a;  1、美工是工人&#xff0c;美术编辑是工头&#xff1b;  2、美工一般是指对平面&#xff0c;色彩 &#xff0c;基调&#xff0c;创意等进行处理的技术人才&#xff0c;分为平面美工、网页美工和三维美工。一般需要精通Photoshop等设计软…

软件架构学习小结

软件架构设计系统整体架构&#xff0c;从需求到设计的每个细节都要考虑到&#xff0c;把握整个项目&#xff0c;使设计的项目尽量效率高&#xff0c;开发容易&#xff0c;维护方便&#xff0c;升级简单。本文从架构师职责、软件架构定义、设计架构、评估架构、架构管理等方面来…

PS教程淘宝美工平面设计入门自学课 photoshop软件零基础视频大全

** PS教程淘宝美工平面设计入门自学课 photoshop软件零基础视频大全 ** 首先了解学会PS可以做什么&#xff1f; PS是什么软件&#xff1f;关注公众号这么久了肯定有所了解吧&#xff0c;全名PhotoShop&#xff0c;如果你是新来的伙计也没关系。 可从事的行业&#xff1a;美…

美工+文案展示

文案美工展示 一、选择题目 博客园安卓版软件 二 、软件预计功能 1 注册微博 2 查看微博 3 发微博 4 回复评论 三、预计软件成型图片 四、选题理由 博客园的网页版深受软件开发人员的喜爱。首先博客园写作自由&#xff0c;开发者在这里拥有自己独立的写作空间&#xff0c;自由发…

美工效果图大小 html,六、DIV CSS实战之布局美工图分析与切图

DIV CSS实战之布局分析与切图 美工图到DIV CSS制作成HTML中间必不可少的步骤为对美工图的分析和美工图的切图。平时大家说切图也是从这个步骤捡取的一个词语来代表css完整制作的代名词&#xff0c;就像div css制作一样。 一、美工图分析 - TOP 在拿到网页美工图或&#xff…