【问题描述】
本题务必使用顺序栈或者链式栈实现。
试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如 “序列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;
}
最近敲代码真的很自闭啊,还是要沉下心,耐心调试,修改代码!
再见啦啦啦啦啦