魔王語言的解釋
c語言
數據結構
【問題描述】
有一個魔王總是使用自己的一種非常精練而抽象的語言講話,沒有人能聽得懂,但他的語言是可以逐步解釋成人能聽懂的語言,因爲他的語言是由以下兩種形式的規則由人的語言逐步抽象上去的:
(1)a→12
(2)(0128n)→08n0n-188
在這兩種形式中,從左到右均表示解釋。試寫一個魔王語言的解釋系統,把他的話解釋成人能聽得懂的話。
【基本要求】
用下述兩條具體規則和上述規則形式(2)實現設大寫字母表示魔王語言的詞彙;小寫字母表示人的語言詞彙;希臘字母表示可以用大寫字母或小寫字母代換的變量魔王語言可含人的詞彙。
(1)b→tAda
(2)a→sae
【實現提示】
將魔王的語言自右至左進棧,總是處理棧頂字符若是開括號,則逐一出棧,將字母順序入隊列,直至閉括號出棧,並按規則要求逐一出隊列再處理後入棧其他情形較簡單,請讀者思考應如何處理。應首先實現棧和隊列的基本操作。
代碼如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define STACK_INIT_SIZE 100//存儲空間初始分配量
#define STACKINCREMENT 10//存儲空間分配增量
#define overflow_error -1typedef char SElemType;//棧元素類型//-----棧的順序存儲表示------
typedef struct
{
SElemType *base;//棧底指針
SElemType *top;//棧頂指針
int stacksize;//當前已分配的存儲空間
}SqStack;//------基本操作的函數原型說明------
int InitStack(SqStack *S);//構造一個空棧
//int DestroyStack(SqStack *S);//銷燬棧S,S不在存在
int Push(SqStack *S, SElemType e);//插入元素e爲新的棧頂元素
int Pop(SqStack *S, SElemType *e);//若棧不空,則刪除S的棧頂元素,用e返回其值int main()
{
char e, temp, Sb;
SqStack S;
InitStack(&S);//棧的定義以及初始化
printf(“依次輸入魔王語言的所有內容(只能包含大小寫字母以及括號),以換行鍵結束,”
“翻譯的結果會在輸入完的下一行自動給出。\n”);
do{//循環輸入魔王語言的每個字母並將括號裏的內容如棧
//括號外的內容直接翻譯並輸出
scanf("%c", &e);
Push(&S, e);
if(e == ‘(’){
Pop(&S, &temp);
scanf("%c", &Sb);
Push(&S, Sb);
do{//對括號裏所有內容做入棧處理
scanf("%c", &e);
Push(&S, e);
}while(e != ‘)’);
Pop(&S, &temp);
}
if(e == ‘A’){//括號外輸入A時所作的翻譯
printf(“sae”);
Pop(&S, &temp);
}
else if(e == ‘B’){//括號外是B時所作的翻譯
printf(“tsaedsae”);
Pop(&S, &temp);
}
else if(e == ‘)’){
do{//對棧內內容的翻譯
Pop(&S, &temp);
if(temp == ‘\n’)continue;
if(S.base != S.top)
printf("%c%c", Sb, temp);
else printf("%c", temp);
}while(S.base != S.top);
}
else printf("%c", e);
}while(e != ‘\n’);
return 0;
}//------基本操作函數的實現------
int InitStack(SqStack S)//構造一個空棧
{
S->base = (SElemType)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base)exit(overflow_error);//存儲空間分配失敗
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 1;
}int Push(SqStack S, SElemType e)
{
if(S->top - S->base >= S->stacksize)//棧滿,追加存儲空間
{
S->base = (SElemType)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S->base)exit(overflow_error);//存儲空間分配失敗
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return 1;
}int Pop(SqStack *S, SElemType *e)
{
if(S->base == S->top)return 0;//彈出失敗,棧爲空棧
*e = *–S->top;
return 1;
}
魔王語言解釋 c語言 數據結構