数据结构栈练习题之回文数

回文数的栈实现

思路
/*
回文数判断的思想
1.需要用到两个栈 一个栈用于压栈 一个用于退栈的接收   这里用到的是静态栈
2.退栈的次数是len / 2 次
3.回文数分为奇数个和偶数个两种情况
*/
代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100//为了简化代码  假设空间足够大 不存在静态栈满的情况
#define FLAG '@'//停止输入的标志

typedef char DataType;
typedef struct
{
    DataType data[MAXSIZE];
    int top;//栈顶指针
}Sqstack;

void Init_Stack(Sqstack *S);
void Enter_Stack(Sqstack *S);
void Show_Stack(Sqstack *S);
int Judge_Palindromic(Sqstack *P,Sqstack *Q);
void Delete_Stack(Sqstack *S,DataType *c);

void main()
{
    Sqstack P,Q;
    printf("初始化栈P、Q:\n");
    Init_Stack(&P);
    Init_Stack(&Q);
    printf("输入回文数:\n");
    Enter_Stack(&P);
    printf("遍历栈P:\n");
    Show_Stack(&P);
    printf("判断是否是回文数:\n");
    if(Judge_Palindromic(&P,&Q))
        printf("输入的是回文数!\n");
    else
        printf("输入的不是回文数!\n");
}

void Init_Stack(Sqstack *S)
{
    S->top = -1;
}

void Enter_Stack(Sqstack *S)
{
    DataType c;
    scanf("%c",&c);
    while(c != FLAG)//停止压栈的标志
    {
        S->top++;
        S->data[S->top] = c;
        scanf("%c",&c);
    }
}

void Delete_Stack(Sqstack *S,DataType *c)//c记录传出的元素
{
    *c = S->data[S->top];
    S->top--;
}

void Show_Stack(Sqstack *S)
{
    int i = 0;
    while(i <= S->top)
    {
        printf("%c  ",S->data[i]);
        i++;
    }
    printf("\n");
}

int Judge_Palindromic(Sqstack *P,Sqstack *Q)
{
    DataType c;
    int len = P->top + 1;
    int i = 0,j = 1;
    while(i < len / 2)//退栈
    {
        Delete_Stack(P,&c);//传参不是传&P   P已经是指针了  直接传P
        Q->top++;
        Q->data[Q->top] = c;
        i++;
    }
    printf("退栈后P中元素:\n");
    Show_Stack(P);
    printf("退栈后Q中元素:\n");
    Show_Stack(Q);
    if(P->top != Q->top)
    {
        P->top--;
    }
    while(i > 0)
    {
        if(Q->data[Q->top] == P->data[P->top])
        {
            Q->top--;
            P->top--;
        }
        else
        {
            j = 0;
            break;
        }
        i--;
    }
    return j;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值