XDOJ魔王语言解释


title: 魔王语言解释
date: 2022-05-13 17:39:53
tags: C语言
categories: 数据结构

问题输入
一组数据,数据为一个字符串,表示一个待翻译的字符串。
转化规则
用下述两条具体规则和上述规则形式实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1)B -> tAdA
(2)A -> sae
问题输出
将字符串按规则翻译后输出。
输入样例
B(pxyzABhij)B
输出样例
tsaedsaepjpiphptsaedsaepsaepzpypxptsaedsae

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100
typedef struct{
	char *base;
	char *top;
	int size; 
}sqStack;   
//构造栈
int InitStack(sqStack *S){
	S->base=(char *)malloc(sizeof(char)*maxsize);
	if(!S->base) exit(0);
	S->size=maxsize;
	S->top=S->base;
	return 1;
} 
//出栈 
int GetTop(sqStack *S,char *c){
	if(S->top==S->base) return 0;
	else *c=*--S->top;
	return 1;
}
//入栈 
int Push(sqStack *S,char c){
	*S->top++=c;
	return 1;
} 
typedef struct QNode * LNode;
struct QNode{
	char data;
	LNode next;
};
typedef struct{
	LNode front;  //队头指针 
	LNode rear;   //队尾指针 
}LinkQueue;
//构造队列 
int InitQueue(LinkQueue *Q){
	Q->front=Q->rear=(LNode)malloc(sizeof(struct QNode));
	Q->front->next=NULL;
	return 1;
}
//入队
int PushQueue(LinkQueue *Q,char c){
	LNode p=(LNode)malloc(sizeof(struct QNode));
	p->data=c;
	p->next=NULL;
	Q->rear->next=p;
	Q->rear=p;
	return 1; 
} 
//出队
int GetQueue(LinkQueue *Q,char *c){
   if(Q->rear==Q->front) return 0;
   LNode p=Q->front->next;
   *c=p->data;
   Q->front->next=p->next;
   if(Q->rear==p) Q->rear=Q->front;
   return 1;
} 
int main(){
	char st[1000],a;
	scanf("%s",st);
	//puts(st);
	sqStack S1,S2;
	LinkQueue L;
	InitQueue(&L);
	InitStack(&S1);
	InitStack(&S2);
	//将字符串从右向左依次入栈 
	for(int i=(strlen(st)-1);i>=0;i--){
		Push(&S1,st[i]);
	}  
	//处理括号内容 
	while(S1.base!=S1.top){
		char r;
		GetTop(&S1,&r);
		if(r!=')'){
			Push(&S2,r);
		} 
		else if(r==')'){
			char C;
			GetTop(&S2,&a);
			while(a!='('){
				PushQueue(&L,a);
				C=a;
				GetTop(&S2,&a);
			}
			while(L.front->next!=L.rear){
				char b;
				GetQueue(&L,&b);
				Push(&S2,C);
				Push(&S2,b);
			}
			Push(&S2,C);
		}
		
	}
    //B和A转化
	while(S2.base!=S2.top){
		char n;
		char A[4]="sae";
		char B[9]="tsaedsae";
		GetTop(&S2,&n);
		if(n!='A'&&n!='B'){
			Push(&S1,n);
		}
		else if(n=='A'){
			for(int i=2;i>=0;i--){
				Push(&S1,A[i]);
			}
		}
		else if(n=='B'){
			for(int i=7;i>=0;i--){
				Push(&S1,B[i]);
			}
		}
	} 
	char m;
	while(S1.base!=S1.top){
		GetTop(&S1,&m);
		printf("%c",m);
	}
}

主要是考察栈和队列,建议画图解决。
欢迎关注博客LeoCache 更多学习资源

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeoCache

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值