魔王语言解释-西电数据结构上机题

个人说明:
本博客的代码用于各位同学借鉴和学习,由于本人的水平有限,因此难免有错误之处,希望各位同学给与意见,共同进步!

魔王语言解释:

在这里插入图片描述

解决思路:

这是第二章的上机作业,我们就知道是用栈的知识来解决问题的,但是光用栈的话实现起来会很费劲,因此我们用队列进行辅助,栈和队列配合来完成,栈和队列的实现可以使用STL,非常的方便,但是我们学习数据结构的目的就是练习创建栈,并使用栈。这里我们还是使用自己创建的栈来解决这个问题。

从翻译规则来看:
A->sae;
B->tAdA;

可以发现这俩个字母的翻译内容是不变的,遇到A就翻译输出sae,如果遇到B可以直接翻译输出为tsaedsae,因此我们不遇到括号的时候,输出是稳定的,直接输出翻译内容就可以了,如果遇到括号,我们可以把分配进去的内容用栈和队列的特点进行处理。因此我们还需要判断一下输入的内容它的括号是不是匹配。

C 代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#define maxsize 100
//栈的顺序存储表示 
typedef struct {
    char *base, *top;
    int stacksize;
}SqStack;         
 
//单链队列--队列的链式存储表示 
typedef struct Node{
    char data;
    struct Node *next;
}Node, *Ptr;
 
typedef struct {
    Ptr front, rear;
}Link;
 
// 对栈的操作 
int InitStack (SqStack *S) 
{   //初始化栈 
    S->base = (char *)malloc(maxsize * sizeof (char));
    if (! S->base) exit(0);
    S->top = S->base;
    S->stacksize = maxsize;
    return 1;
}
 //入栈 
int Push (SqStack *S, char c)
{  
    * S->top ++ = c;
    return 1; 
}
 //出栈 
int Pop (SqStack *S,char *c)
{  
    if (S->base == S->top)  return 0;
    *c = * --S->top;
    return 1;
}
 
// 对队列的操作 
int Initline (Link *L)
{   //初始化队列 
    L->front = L->rear = (Ptr)malloc(sizeof(Node));
    if (!L->front) exit(0);
    L->front->next = NULL;
    return 1;
}
 
int inputline (Link *L, char c)
{   //入队列 
    Ptr p;
    p = (Ptr)malloc(sizeof(Node));
    if (!p) exit(0);
    p->data = c; p->next = NULL; 
    L->rear->next = p;
	L->rear = p;
    return 1;  
}
 
int outputline (Link *L, char *c)
{   //出队列 
    Ptr p;
    if (L->front == L->rear)   return 0;
    p = L->front->next;
    *c = p->data;
    L->front->next = p->next;
    if (L->rear == p) 
    L->rear = L->front;
    free(p);
    return 1;
}
  
//检查括号是否匹配的函数实现 
int kuohao (char *str)     
{    
    int sum = 0;                         
    char *p, c;
    SqStack K;
    InitStack(&K);
    for (p= str; *p; p ++)
    {
       switch(*p)
       {
           case '(':
                    Push(&K,*p);   
                    sum=sum+1;  break;
           case ')': 
                    if (K.base  == K.top) return 0;
                    Pop(&K,&c); 
                    if (c != '(')   return 0;      
                    break;
           //default :                  break;
       }
    }
   
    if (K.base == K.top && sum)
    {
       free(K.base );
       return 1;
    }
    else if (sum == 0)
        return 1; 
    else 
    {
       free(K.base );
       return 0; 
    }
} //函数结束 
 
// 最后处理 
void special (SqStack *S, SqStack *S1)
{
char ch, B[9] = "tsaedsae", A[4] = "sae";
int i = 0;
while(S1->base != S1->top){
    Pop (S1, &ch);
    switch (ch){
        case 'A': 
            for (i = ( strlen(A) - 1 ); i >= 0; -- i)
                Push(S, A[i]);
                 break;
        case 'B': 
            for (i = ( strlen(B) - 1 ); i >= 0; -- i)
                Push(S, B[i]);
                break;
    default : Push(S, ch);  break;
       }
    }  
}

int main ()
{
    int i;
    char R, T, B, str[1000] = {0};
    SqStack S, X; 
    Link temp;
    InitStack (&S);
    InitStack (&X);
    Initline (&temp);
    scanf("%s", str);
 
    if ( kuohao(str) )
    {
        for (i = ( strlen(str) - 1 ); i >= 0; -- i)
            Push(&S, str[i]);
 
        while(S.base != S.top)
        {
            Pop(&S, &R);
            if (R != ')')
               Push(&X, R);
            else if(R == ')')
            {
                while (X.base != X.top )
                {
                   Pop(&X, &T);
                   if (T != '(')
                   {
                      inputline (&temp, T);
                     B = T;
                   }
                   else   break;
                }
 
                while (temp.front->next != temp.rear)
                {
                    outputline (&temp, &T);
                    Push (&X, B);
                    Push (&X, T);
                }
 
                outputline (&temp, &T);
                Push (&X, T);
            }
        }
        special (&S, &X);
        while ( Pop(&S,&R) )
        printf ("%c", R);   
    }
    return 0;
} 

总结:

这是用栈和队列结合实现的一个程序,算是比较简单的一个程序,就是在实现的时候要注意实现的方式,还有括号匹配和括号外字符分配问题。这个问题还有其他的实现方式,希望同学们多动手多思考!

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值