标题:求助各位大神帮忙看一个“魔王语言”的程序
只看楼主
龙翔在天
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-11-3
 问题点数:0 回复次数:0 
求助各位大神帮忙看一个“魔王语言”的程序
[问题描述]   
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:   
(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上显示有个样例结果错误,想请大神看看我没考虑哪种情况(先不用考虑括号不匹配的问题)。
搜索更多相关主题的帖子: top char exit void base 
2020-11-04 23:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503768-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.112886 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved