栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

XDOJ魔王语言解释

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

XDOJ魔王语言解释


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

问题输入
一组数据,数据为一个字符串,表示一个待翻译的字符串。
问题输出
将字符串按规则翻译后输出。
输入样例
B(pxyzABhij)B
输出样例
tsaedsaepjpiphptsaedsaepsaepzpypxptsaedsae

#include
#include
#include
#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 更多学习资源

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883567.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号