数据结构---回文判断

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

回文判断

题目描述

假设称正读和反读都相同的字符序列为“回文”,例如,’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;
}
相关文章
|
3月前
|
存储 Linux 分布式数据库
数据结构十弹---二叉树
数据结构十弹---二叉树
|
10月前
|
存储 机器学习/深度学习 编译器
超详细的数据结构---顺序表的有关教程
超详细的数据结构---顺序表的有关教程
|
3月前
|
算法
从0开始回顾数据结构---二叉树
二叉树 1、二叉树的建立 层序遍历重建二叉树 测试样例: 11 3 9 20 -1 -1 15 7 -1 -1 -1 -1 中序遍历结果: 9 3 15 20 7 #include<iostream> #include<cstdio> using namespace std; int n, num; //定义一棵二叉树 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int _val) : val(_val), left(nullptr), right(nullp
|
3月前
|
存储 关系型数据库 MySQL
数据结构---B+Tree
数据结构---B+Tree
32 1
|
11月前
54.【数据结构--- 栈与队列】(一)
54.【数据结构--- 栈与队列】
56 0
|
3月前
从0开始回顾数据结构---红黑树
红黑树 1、什么是红黑树 红黑树是一种不严格的平衡二叉树,插入、删除、查找的最坏时间复杂度都为 O(logn),避免了二叉树最坏情况下的O(n)时间复杂度。 红黑树特性如下: 1. 根节点是黑色 2. 每个节点要么是黑色要么是红色 3. 每个红色节点的两个子节点一定都是黑色 4. 每个叶子节点(NIL)都是黑色 5. 任意一个节点的路径到叶子节点所包含的黑色节点的数量是相同的---这个也称之为黑色完美平衡 6. 新插入的节点必须是红色->为什么?如果新插入的节点是黑色,那不管是在插入到那里,一定会破坏黑色完美平衡的,因为任意一个节点的路径到叶子节点的黑色节点的数量肯定不一样了。 2、为什么需
|
3月前
|
存储
数据结构---树
数据结构---树
|
3月前
|
算法 C语言
数据结构---堆
数据结构---堆
|
3月前
|
存储
数据结构---二叉树
数据结构---二叉树