数据结构---回文判断

简介: 数据结构---回文判断

回文判断

题目描述

假设称正读和反读都相同的字符序列为“回文”,例如,’abba’和’abcba’是回文,’abcde’和’ababab’则不是回文。请编写一个程序判别读入的一个以’@’为结束符的字符序列是否是“回文”。提示:由于依次输入的字符序列中不含特殊的分隔符,则在判别是否是“回文”时,一种比较合适的做法是,同时利用“栈”和“队列”两种结构。

题目解析

本题也很简单,创建队列和栈两个数据结构,分别取Top比较再Pop,放到while循环里即可

//3. 假设称正读和反读都相同的字符序列为“回文”,例如,’abba’和’abcba’是回文,’abcde’和’ababab’则不是回文。
//请编写一个程序判别读入的一个以’@’为结束符的字符序列是否是“回文”。
//提示:由于依次输入的字符序列中不含特殊的分隔符,则在判别是否是“回文”时,一种比较合适的做法是,同时利用“栈”和“队列”两种结构。\

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef char QueueDataType;
typedef struct QNode
{
   
    QueueDataType data;
    struct QNode* next;
}QNode;

typedef struct Queue
{
   
    QNode* phead;
    QNode* ptail;
}Queue;

void QueueInit(Queue* pq)
{
   
    pq->phead = NULL;
    pq->ptail = NULL;
}

QNode* BuynewQNode(QueueDataType x)
{
   
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
   
        perror("malloc fail");
        return NULL;
    }
    newnode->data = x;
    newnode->next = NULL;
    return newnode;
}

void QueuePush(Queue* pq, QueueDataType x)
{
   
    assert(pq);
    QNode* newnode = BuynewQNode(x);
    if (pq->phead == NULL)
    {
   
        pq->phead = pq->ptail = newnode;
    }
    else
    {
   
        pq->ptail->next = newnode;
        pq->ptail = newnode;
    }
}

void QueuePop(Queue* pq)
{
   
    assert(pq);
    assert(pq->phead);
    pq->phead = pq->phead->next;
}

QueueDataType QueueTop(Queue* pq)
{
   
    assert(pq);
    assert(pq->phead);
    return pq->phead->data;
}

bool QueueEmpty(Queue* pq)
{
   
    assert(pq);
    if (pq->phead == NULL)
    {
   
        return true;
    }
    else
    {
   
        return false;
    }
}

typedef char STDataType;
typedef struct Stack
{
   
    STDataType* a;
    int capacity;
    int top;
}Stack;

void StackInit(Stack* pst)
{
   
    pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);
    if (pst->a == NULL)
    {
   
        perror("malloc fail");
        return;
    }
    pst->capacity = 4;
    pst->top = 0;
}

STDataType StackTop(Stack* pst)
{
   
    assert(pst);
    assert(pst->top);
    return pst->a[pst->top - 1];
}

void StackPop(Stack* pst)
{
   
    assert(pst);
    assert(pst->top);
    pst->top--;
}

void StackPush(Stack* pst, STDataType x)
{
   
    assert(pst);
    if (pst->capacity = pst->top)
    {
   
        STDataType* tmp = NULL;
        int newcapacity = pst->capacity * 2;
        tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
        if (tmp == NULL)
        {
   
            perror("realloc fail");
            return;
        }
        pst->a = tmp;
        pst->capacity = newcapacity;
    }
    pst->a[pst->top] = x;
    pst->top++;
}

bool StackEmpty(Stack* pst)
{
   
    if (pst->top == 0)
        return true;
    else
        return false;
}

void Input(Queue* pq, Stack* ps)
{
   
    char ret;
    printf("输入回文字符,以@结尾->");
    while (1)
    {
   
        scanf("%c", &ret);
        if (ret == '@')
            break;
        QueuePush(pq, ret);
        StackPush(ps, ret);
    }
}

void Judge(Queue* pq, Stack* ps)
{
   
    while (!QueueEmpty(pq))
    {
   
        char que = QueueTop(pq);
        QueuePop(pq);
        char st = StackTop(ps);
        StackPop(ps);
        if (que!=st)
        {
   
            printf("不是回文\n");
            return;
        }
    }
    printf("是回文\n");
    return;
}

int main()
{
   
    Queue q;
    Stack s;
    QueueInit(&q);
    StackInit(&s);
    Input(&q, &s);
    Judge(&q, &s);
    return 0;
}
相关文章
【数据结构】链表的回文结构
【数据结构】链表的回文结构
|
29天前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
23 0
|
4月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
36 0
【数据结构OJ题】链表的回文结构
|
5月前
|
算法 C语言
【数据结构与算法 经典例题】链表的回文结构(图文详解)
【数据结构与算法 经典例题】链表的回文结构(图文详解)
|
存储 C语言 C++
C语言---数据结构实验---数制转换---表达式求值---回文判断---二叉树创建遍历
C语言---数据结构实验---数制转换---表达式求值---回文判断---二叉树创建遍历
|
6月前
|
算法 Java C++
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
34 0
|
存储 算法 测试技术
【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表2
【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表
115 0
【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表2
【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表
【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表
94 0
【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表
|
算法 Python
利用python的双向队列(Deque)数据结构实现回文检测的算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn # Release 3.0 # chengang882 @ 2016-12-20 # 它可以将常见的中缀表达式转换成后缀表达式,并计算这个表达示的值 # Complete...
894 0
|
1天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
28 9