试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2都不含字符“&”,且序列2是序列1的逆序列。例如,“a+b&b+a”是属该模式

由于题目要求,此篇文章用的是纯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的指针的用法快忘得差不多了…调用函数要传递的是变量的地址,定义的函数头里要写上指针的形式。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值