/********************
*
*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");
}
魔王解释语言
最新推荐文章于 2023-07-03 00:19:56 发布