求助各位大神帮忙看一个“魔王语言”的程序
[问题描述] 有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)α->β1β2...βn
(2)(θδ1δ2...δn)->θδnθδn-1...θδ1θ
在这两种形式中,从左到右均表示解释;从右到左表示抽象。试写一个魔王解释系统,把他的话解释成人能听懂得话。
[基本要求]
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母(a,b1,s,y1等)表示可以用大写或小写字母代换的变量。 魔王语言可含人的词汇。
(1) B->tAdA
(2) A->sae
[测试数据]
B(einxgz)B
解释成 tsaedsaeezegexeneietsaedsae
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCEREMENT 10
//顺序栈的类型定义
typedef struct SqStack{
char *base, *top;
int stacksize;
}SqStack;
//栈的初始化
void InitStack(SqStack *S){
S->base=(char *)malloc(STACK_INIT_SIZE * sizeof(char));
if(!S->base)exit(0);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
}
//入栈
void Push(SqStack *S, char e){
if(S->top - S->base >= S->stacksize){
S->base = (char *)realloc(S->base, S->stacksize + STACKINCEREMENT);
if(!S->base) exit(0);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCEREMENT;
}
*S->top++ = e;
}
//出栈
void Pop(SqStack *S){
if(S->top == S->base)
exit(0);
S->top--;
}
//读取栈顶元素
char GetTop(SqStack *S){
char m;
if(S->top == S->base)
exit(0);
m = *(S->top-1);
return m;
}
//链队列的类型定义
typedef struct QNode{
char data;
struct QNode *next;
}QNode;
typedef struct LinkQueue{
QNode *front;//队头指针
QNode *rear;//队尾指针
}LinkQueue;
//队列初始化
void InitQueue(LinkQueue *Q){
Q->front = (QNode*)malloc(sizeof(QNode));
if(!Q->front) exit(0);
Q->rear = Q->front;
Q->front->next = NULL;
}
//入队列
void EnQueue(LinkQueue *Q, char e){
QNode *p = (QNode*)malloc(sizeof(QNode));
if(!p)exit(0);
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
//出队列
char DeQueue(LinkQueue *Q){
char e;
if(Q->front == Q->rear)exit(0);
QNode *p = Q->front->next;
e = p->data;
Q->front->next = p->next;
if(Q->rear==p)Q->rear=Q->front;
free(p);
return e;
}
//销毁队列
void DestroyQueue (LinkQueue *Q){
if(Q->front==Q->rear)Q->front=NULL;
}
//括号内递归操作
void work(SqStack *S){
char elem,e;
int count=0;
LinkQueue Q;
InitQueue(&Q);
Pop(S);
err:if(GetTop(S)!=')'){
while(GetTop(S) != ')'){
if(GetTop(S)=='('){
work(S);
goto err;
}
EnQueue(&Q, GetTop(S));
count++;
Pop(S);
}
Pop(S);
e = DeQueue(&Q);
elem = e;
count--;
Push(S, e);
while(count>0){
e = DeQueue(&Q);
count--;
Push(S, e);
Push(S, elem);
}
DestroyQueue(&Q);
}
else{
Pop(S);
DestroyQueue(&Q);
}
}
//翻译
void translate (SqStack *S){
char e;
while(S->top != S->base ){
e = GetTop(S);
if(e == 'A'){
printf("sae");
Pop(S);
}
else if(e == 'B'){
printf("tsaedsae");
Pop(S);
}
else if(e>=97&&e<=122){
printf("%c",e);
Pop(S);
}
else work(S);
}
}
int main()
{
int i;
char str[1000], elem;
scanf("%s",str);
char e;
SqStack S;
InitStack(&S);
for(i = strlen(str) - 1; i >= 0; i--){
Push(&S, str[i]);
}
translate(&S);
return 0;
}
程序提交到学校OJ上显示有个样例结果错误,想请大神看看我没考虑哪种情况(先不用考虑括号不匹配的问题)。