魔王解释语言

/********************
*
*author @zmj_hdu
*	2013-11-05
*
*********************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 50
#define ADDSIZE 10
#define OVERLOW -2
#define ERROR -1



typedef struct {
	char *base;
	int top;
	int size;
}SqStack;

typedef struct {
	char  *base;
	int front;
	int rear;
}SqQueue;



//初始化顺序桟
void Init_SqStack(SqStack &s) {
	s.base = (char *)malloc(sizeof(char) * SIZE);
	if(!s.base) exit(OVERLOW);
	s.top = 0;
	s.size = SIZE;
}

//压入数据
void Push_SqStack(SqStack &s, char c) {
	if(s.top >= s.size) {
		s.base = (char *)realloc(s.base,(sizeof(char) * (s.size + ADDSIZE)));
		s.size += ADDSIZE;
	}
	s.base[s.top] = c;
	s.top ++;
}

//出桟
int Pop_SqStack(SqStack &s, char &e) {
	if(s.top == 0) 
		return 0;
	s.top --;
	e = s.base[s.top];
	return 1;
}

char GetTop_SqStack(SqStack s) {
	return s.base[s.top - 1];
}

int IsEmpty_SqStack(SqStack s) {
	if(s.top == 0)
		return 1;
	else 
		return 0;
}

//初始化
void Init_SqQueue(SqQueue &q) {
	q.base = (char *)malloc(sizeof(char) * SIZE);
	if(!q.base)
		exit(OVERLOW);
	q.front = 0;
	q.rear = 0;
}

//进队列
void En_SqQueue(SqQueue &q, char c) {
	if((q.rear + 1) % SIZE == q.front) exit(ERROR);
	q.base[q.rear] = c;
	q.rear = (q.rear + 1) % SIZE;
}

int De_SqQueue(SqQueue &q, char &e) {
	if(q.front == q.rear)
		return 0;
	e = q.base[q.front];
	q.front = (q.front + 1) % SIZE;
	return 1;
}

//打印字符
void Translate(char c) {
	printf("%c",c);
}

//将字符串反向
void Reverse(char str[],char strtmp[]) {
	int len = strlen(str);
	int i,t=0;
	for(i=len - 1;i>=0;i--)
		strtmp[t++] = str[i];
	strtmp[t] = '\0';
}

int Execute(char ch[], SqStack &s, SqQueue &q) {
	SqStack ss;
	Init_SqStack(ss);
	char ch1[100];
	char ch2[100];
	char ch3[100];
	char c1,e,c;
	int flag=0,t = 0,i=0,len;
	Reverse(ch,ch1);							//将输入进来的ch 反向
	for(i=0;ch1[i]!='\0';i++)
		Push_SqStack(s,ch1[i]);
	while(Pop_SqStack(s,e) == 1) {
		if(flag != 0 && e != ')') {				//此处是为了将找到第一个左括号之后的字符全部进入括号操作 桟ss 中
			Push_SqStack(ss,e);
			if(GetTop_SqStack(ss) == '(') {		//遇到左括号 '('  flag加1
					flag ++;
			}
			continue;
		}
		if(e == 'B') {							//如果是字符'B'就进桟 
			Push_SqStack(s,'A');
			Push_SqStack(s,'d');
			Push_SqStack(s,'A');
			Push_SqStack(s,'t');
		}
		else if(e == 'A') {						//如果是字符'A'就相对应的字符进队列
			En_SqQueue(q,'s');
			En_SqQueue(q,'a');
			En_SqQueue(q,'e');
		}
		else if(e == '(') {
			Push_SqStack(ss,e);
			flag ++;							//flag每加一次,都有一个左括号,用flag来表示左括

号的数量
		}
		else if(e == ')') {
			if(flag == 0){
				printf("输入的括号不匹配!\n");	//左括号和右括号不匹配,右括号比左括号多
				exit(-1);
			}
			t=0;
			while(GetTop_SqStack(ss) != '(') {
				Pop_SqStack(ss,c);
				ch2[t++] = c;
			}
			Pop_SqStack(ss,c);					//弹出左括号  '('
			flag --;							//每弹出一个左括号就flag减少 1
			ch2[t] = '\0';
			len = strlen(ch2);
			if(len == 0)						//此处是处理空括号的情况
				continue;
			c1 =ch2[len - 1];
			t = 0;
			for(i=0;i<len - 1;i++) {			//此步是对括号中的操作
				ch3[t++] = c1;
				ch3[t++] =ch2[i];
			}
			ch3[t++] = c1;						//对第一个字符的操作(在最后一个字符处加上第一个字符:上一

步的操作时只操作到最后第二个字符)
			ch3[t] = '\0';
			
			if(IsEmpty_SqStack(ss) == 1) {		//如果操作括号的ss桟里面为空,则说明处理过程结束, ch3字符串现在是标准处

理好的字符串,将ch3字符串倒着进入原来的桟s
				Reverse(ch3,ch2);
				for(i=0;ch2[i]!='\0';i++) {
					Push_SqStack(s,ch2[i]);		//进入之前操作的桟
				}
			}
			else  {								//如果括号操作 桟ss 不空,则将操作好的一个括号

中的字符压入字符操作 桟ss 等待下一个右括号字符 ')'的输入
				for(i=0;ch3[i]!='\0';i++) {
					Push_SqStack(ss,ch3[i]);
				}
			}
		}
		else
			En_SqQueue(q,e);
	}
	if(flag != 0)
		return 0;
	else
		return 1;
}


void main() {
	char ch[100];
	char e;
	gets(ch);
	SqStack s;
	SqQueue q;
	Init_SqStack(s);
	Init_SqQueue(q);
	if(Execute(ch,s,q) == 1) {
		while(De_SqQueue(q,e) == 1) {
			Translate(e);
		}
	}
	else 
		printf("输入的括号不匹配!");	//左括号比右括号多,不匹配
	printf("\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值