数据结构之判断字符串镜像——栈

【问题描述】

本题务必使用顺序栈或者链式栈实现。
试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如 “序列1&序列2” 模式的字符序列。其中序列1和序列2都不含字符 “&”,且序列2是序列1的逆序列。例如,“ a+b&b+a ”是属该模式的字符序列,而 “1+3&3-1”则不是。

【输入形式】
以@为结尾的一串字符

【输出形式】
若符合模式则输出字符串长度,否则输出no

【样例输入】
a+b&b+a@

【样例输出】
3

【评分标准】

使用顺序栈或链式栈的知识,否则不能得分。

这道题从思路上来说还是较为简单的。因为想想栈的主要操作就能明白这道题该怎么敲了。
先来回顾一下栈的基本操作和特点。
在这里插入图片描述
栈这个东西有着元素先进后出的特点,要使先进后出成为可能,就不能像普通链表一样,往尾结点后创建新结点然后插入进去,这样是实现不了的。因为在删除或get栈顶端的元素内容就要一直遍历从头到尾,这样就很没有意思,栈也没有存在的意义。所以创建新结点的时候就先创建新的结点然后往里面赋值,在连在头结点后面,如此往复,一个栈就成功的创建出来了。
主要操作如下

typedef struct SNode *stack;
struct SNode{
    ElemntType data;
    stack next;
}SNode;
stack Initstack()
{
    stack s;
    s=(stack)malloc(sizeof(struct SNode));
    s->next=NULL;
    return s;
}
下面是进栈的操作
void push(ElementType n,stack s)
{
    stack temp;
    temp=(stack)malloc(sizeof(struct SNode));
    temp->data=n;
    temp->next=(s)->next;
    (s)->next=temp;
}

在这里插入图片描述

栈还有出栈的操作pop 就是把栈顶的元素弹出来,然后清空存储这个元素的结点,这样就能继续下一个pop操作,如果栈是非空的话。

ElementType pop(stack s)
{
    stack FirstCell;
    ElementType TopElem;
    FirstCell = s->next;
    s->next=FirstCell->next;
    TopElem=FirstCell->data;
    free(FirstCell);
    return TopElem;
}

除此之外还有可以get这个元素的函数,有时候我们需要知道一下栈顶的元素,用来和待入栈的元素进行一下比较或者判断之类的,这时就不能把它的结点空间释放掉了,释放了就没了。代码实现也十分简单

ElemenType get(stack s)
{
	if(s->next!=NULL)
		return s->next->data;
}

在这里插入图片描述
讲了这么多操作是不是对这道题的实现有点思路了。
先判断是否输入到了&,在&之前一直执行push操作,检索到了&后就执行pop操作判断pop出来的元素是否和输入元素相等,如果不等的话直接输出“no“,然后return 0,再来个;在这个时候没有结束程序的话说明符合镜像,输出序列一的长度,这个在扫到&之前每输入一个字符就能i++一下是不是思路十分简单。但是主函数并不好写,我对C的字符输入不是很了解,再加上被网上的输入方式给误导了,结构改了炒鸡多次的主函数,结果都是运行时错误,快枯了,但最后还是把输入的地方改了,然后就过了,说明我的思路没有错,我的代码也没错啊哈哈哈哈,但输入格式错了!!!!
在这里插入图片描述
讲了这么多直接上代码吧

#include<stdio.h>
#include<stdlib.h>
typedef struct SNode *stack;
struct SNode{
    char data;
    stack next;
}SNode;
stack Initstack()
{
    stack s;
    s=(stack)malloc(sizeof(struct SNode));
    s->next=NULL;
    return s;
}
void push(char n,stack s)
{
    stack temp;
    temp=(stack)malloc(sizeof(struct SNode));
    temp->data=n;
    temp->next=(s)->next;
    (s)->next=temp;
}
char pop(stack s)
{
    stack FirstCell;
    char TopElem;
    FirstCell = s->next;
    s->next=FirstCell->next;
    TopElem=FirstCell->data;
    free(FirstCell);
    return TopElem;
}
int main()
{
    stack a;
    a=Initstack();
    int i=0;
    int flag=1;
    char s;
    while(scanf("%c",&s)&&s!='@'){
        if(s=='&'){
            flag=0;
        }
        else{
            if(flag){
                push(s,a);
                i++;
            }
            else{
                if(pop(a)==s){
                    continue;
                }
                else{
                    printf("no");
                    return 0;
                }
            }
        }
    }
    printf("%d",i);
    return 0;

}

在这里插入图片描述
最近敲代码真的很自闭啊,还是要沉下心,耐心调试,修改代码!
再见啦啦啦啦啦

  • 17
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值