-->
当前位置:首页 > 题库 > 正文内容

函数题:回文字符串的判别(链栈)【有题解视频】

Luz3年前 (2022-05-27)题库1043
本题要求设计一个算法,判断用户输入的字符串是否是回文字符串,用户输入的字符串同时存储于链栈和链队列中。
所涉及的链栈结点和链队列结点定义如下:
c
typedef char DataType;
/* 链栈的结点定义 */
typedef struct SNode
{
DataType data;
struct SNode *next;
}SNode,*LinkStack;
/* 链队列的结点定义 */
typedef struct QNode
{
DataType data;
struct QNode *next;
}LQNode,*PQNode ;
/* 链队列的定义 */
typedef struct
{
PQNode front, rear; // 链队列的队头和队尾指针
}LinkQueue;


### 函数接口定义:
c
int JudgePalindrome(LinkStack st,LinkQueue qu);

st 和 qu 都是用户传入的参数, 其中st 是链栈的头指针,qu 是链队列的头指针。如果是回文字符串,则函数返回1,反之返回0。

### 裁判测试程序样例:
c
#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
typedef struct SNode
{
DataType data;
struct SNode *next;
}SNode,*LinkStack;
int InitLinkStack( LinkStack *top )
{
*top = (LinkStack)malloc( sizeof(SNode) );
if( *top == NULL )
{
printf("初始化链栈出错");
return 0;
}
(*top)->next = NULL;
return 1;
}
int LinkStackEmpty( LinkStack top )
{
if( top->next == NULL )
return 1;
else
return 0;
}
int Push(LinkStack top, DataType e)
{
SNode *p;
p = (SNode*)malloc(sizeof(SNode));
if (!p)
{
printf("入栈操作出错!\n");
return 0;
}
p->data = e;
p->next = top->next;
top->next = p;
return 1;
}
int Pop(LinkStack top, DataType *e)
{
SNode *p;
if (!top->next)
{
printf("栈已空,无法完成出栈操作!\n");
return 0;
}
p = top->next;
top->next = p->next;
*e = p->data;
free(p);
return 1;
}
int Destroy(LinkStack top)
{
SNode *p;
while (top)
{
p = top;
top = top->next;
free(p);
}
return 1;
}
typedef struct QNode
{
DataType data;
struct QNode *next;
}LQNode,*PQNode ;
typedef struct
{
PQNode front, rear;
}LinkQueue;
int InitLinkQueue(LinkQueue* Q)
{
Q->front = Q->rear = (PQNode)malloc(sizeof(LQNode));
if (!Q->front)
{
printf("初始化队列失败!\n");
return 0;
}
Q->front->next = NULL;
return 1;
}
int LinkQueueEmpty(LinkQueue Q)
{
if (Q.front == Q.rear) return 1;
else return 0;
}
int EnLinkQueue(LinkQueue* Q, DataType e)
{
PQNode p;
p = (PQNode)malloc(sizeof(LQNode));
if (!p)
{
printf("内存分配失败,不能完成入队操作!\n");
return 0;
}
p->data = e;
p->next = NULL;//初始化入队结点
Q->rear->next = p;
Q->rear = p;
return 1;
}
int DeLinkQueue(LinkQueue* Q, DataType* e)
{
PQNode p;
if (Q->front == Q->rear)
{
printf("队列已空,不能完成出队操作!\n");
return 0;
}
p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
free(p);
if (Q->rear == p) //若删除的队列是最后一个结点,则移动队尾指针
{
Q->rear = Q->front;
}
return 1;
}
int DestroyLinkQueue(LinkQueue* Q)
{
while (Q->front)
{
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;

}
return 1;
}
int JudgePalindrome(LinkStack st,LinkQueue qu);
int main()
{
LinkStack s;
LinkQueue q;
char ch;
int rst;
InitLinkStack(&s);
InitLinkQueue(&q);
while((ch=getchar())!='\n')
{
Push(s,ch);
EnLinkQueue(&q,ch);
}
rst = JudgePalindrome(s,q);
if ( rst == 0 )
{
printf("不是回文字符串\n");
}
else
{
printf("是回文字符串\n");
}
Destroy(s);
DestroyLinkQueue(&q);
return 0;
}

/* 请在这里填写答案 */


### 输入样例:
in
asdfghjklkjhgfdsa



### 输出样例:
out
是回文字符串







答案:若无答案欢迎评论

#写在前面的话#

*提供题解视频,是为了帮助大家掌握算法的思想,在今后的编程、考试、面试中,换了语言,换了编译器,换了开发平台,都能重现这种思想,从而编写出任意语言任意编译器任意开发平台下面的这种算法的代码来,所以对于一打开题解报告,就直接拖到视频最后看参考代码的做法,我们非常不赞同,也不符合我们制作PPT录制讲解视频的初衷,希望大家体谅我们的苦心。*

https://www.bilibili.com/video/BV1iu411q7Ai/


![LinkStack2.png](~/8efe7abb-e659-47e1-9fd2-cb3a1c2a2261.png)

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。