概述
由于题目要求,此篇文章用的是纯c写的…
已经一年半没有写c的我一口老血喷出来…
【问题描述】
试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2都不含字符“&”,且序列2是序列1的逆序列。例如,“a+b&b+a”是属该模式的字符序列,而“1+3&3-1”则不是。
【输入形式】
以@为结尾的一串字符
【输出形式】
若符合模式则输出字符串长度,否则输出no
【样例输入】
a+b&b+a@
【样例输出】
3
#include<stdio.h>
#include<malloc.h>
#define STACK 100
#define STACKINCRMENT 10
//顺序栈
typedef char ElementType;
typedef struct SqStack{
ElementType *base;//在栈构造之前和销毁之后,base的值为NULL
ElementType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
void InitStack(SqStack *S){
S->base=(ElementType*)malloc(STACK*sizeof(ElementType));
if(!S->base) printf("分配存储空间失败");
S->top=S->base;
S->stacksize=STACK;
//return true;
}
void Push(SqStack *S,ElementType e){
if(S->top-S->base>=S->stacksize){
S->base=(ElementType*)realloc(S->base,(S->stacksize+STACKINCRMENT)*sizeof(ElementType));
if(!S->base) printf("空间不足");
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCRMENT;
}
*S->top++ = e;
}
ElementType Pop(SqStack *S){
ElementType e;
if(S->top!=S->base) {
e= *--S->top;
return e;
}
}
int main(){
SqStack S;
ElementType e,p;
int flag=0,length=0;
InitStack(&S);
scanf("%c",&e);
while(e!='&'&&flag==0){
Push(&S,e);
length++;
scanf("%c",&e);;
}
if(e=='&') flag=1;
if(flag==1){
scanf("%c",&e);
while(e!='@'&&S.top!=S.base){
p=Pop(&S);
if(e!=p) {
printf("no");
return 0;
}
else scanf("%c",&e);;
}
}
printf("%d",length);
}
这个题目让我写到崩溃…
1.首先,主函数中的S不能定义为结构体指针,如果写成了指针,要先进行初始化,让他指向一个结构体(即:结构体指针是指向结构体的指针!!!)!!!!!而初始化函数只是对结构体中的base和top指针进行了初始化!!!
2.c++中的struct和c中的struct,typedef struct 用法有一点不一样,需要注意!大家可以去网上找找看,有很详细的解释。
3.自打学了c++之后,c的指针的用法快忘得差不多了…调用函数要传递的是变量的地址,定义的函数头里要写上指针的形式。
最后
以上就是如意豆芽为你收集整理的试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2都不含字符“&”,且序列2是序列1的逆序列。例如,“a+b&b+a”是属该模式的全部内容,希望文章能够帮你解决试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2都不含字符“&”,且序列2是序列1的逆序列。例如,“a+b&b+a”是属该模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复