資料結構魔王語言問題

2021-07-26 03:00:41 字數 3301 閱讀 2251

出處:

[問題描述] 

有乙個魔王總是使用自己的一種非常精練而又抽象的語言講話,沒有人能聽得懂,但他的語言是可以逐步解釋**能聽懂的語言,因為他的語言是由以下兩種形式的規則由人的語言逐步抽象上去的: 

(1) α -> β1β2…βm 

(2)(θδ1δ2…δn)->θδnθδn-1… θδ1θ 

在這兩種形式中,從左到右均表示解釋。試寫乙個魔王語言的解釋系統,把他的話解釋**能聽得懂的話。 

[基本要求] 

用下述兩條具體規則和上述規則形式(2)實現。設大寫字母表示魔王語言的詞彙;小寫字母表示人的語言詞彙;希臘字母表示可以用大寫字母或小寫字母代換的變數。魔王語言可含人的詞彙。 

(1)b -> tada 

(2)a -> sae 

[測試資料] 

b(ehnxgz)b解釋成tsaedsaeezegexenehetsaedsae

解題思路:

將魔王語言作為乙個字串讀入進來,首先檢查括號是否匹配,如果不匹配就無法解釋。如果匹配,然後將字串從尾到頭依次壓入棧s中,將棧s中的內容依次彈出壓入棧s2中,直至遇到右括號,將其壓入棧s1中,並將棧s2彈出依次壓入棧s1中,直至遇到左括號壓入棧s1中,這樣棧s1中存放的內容就是匹配的第乙個內重括號,將棧s1棧頂元素左括號彈出,將左括號下面的那個元素儲存在e1變數中,然後將其他元素彈出依次壓入棧s3中,在將e1與棧s3中依次彈出的元素壓入棧s2中,重複這個過程,直至將魔王語言中所有的括號都處理完為止,所以這個思路可以處理多重括號巢狀的問題。。

完整的實現**如下:

[cpp]view plain

copy

#include "iostream"

#include "string"

using

namespace

std;  

class

sqstack    

//使用鍊錶實現棧類

;  node *top,*base;  

public

:  sqstack();  

virtual

~sqstack();  

bool

push(

char

e);  

bool

pop(

char

&e);  

bool

stackempty();  

};  

//棧的基本操作

sqstack::sqstack()  

sqstack::~sqstack()  

bool

sqstack::push(

char

e)    

//壓棧操作

else

}  bool

sqstack::pop(

char

&e)    

//出棧操作

else

}  bool

sqstack::stackempty()  

//判斷是否為空棧

class

sqqueue    

//使用鍊錶實現佇列類

;  node *head,*last;  

public

:  sqqueue();  

virtual

~sqqueue();  

bool

enqueue(

char

e);  

bool

dequeue(

char

&e);  

bool

queueempty();  

void

outqueue();  

void

enqueue_a();  

void

enqueue_b();  

};  

//佇列的基本操作

sqqueue::sqqueue()  

sqqueue::~sqqueue()  

bool

sqqueue::enqueue(

char

e)    

//入佇列

else

}  bool

sqqueue::dequeue(

char

&e)    

//出佇列

else

}  void

sqqueue::outqueue()    

//輸出佇列中的資料

bool

sqqueue::queueempty()  

void

sqqueue::enqueue_a()  

void

sqqueue::enqueue_b()  

bool

read_language(sqstack &s)        

//將魔王語言倒置壓入棧中

if(left!=right)  

return

false

;  for

(i=n-1;i>=0;i--)  

return

true

;  }  

void

push_and_pop(sqstack &s1,sqstack &s2)      

//處理規則2

while

(!s3.stackempty())  

s2.push(e1);  

}  }  

}  int

main(

void

)    

while

(!s.stackempty())  

if(e==

'(')  

s1.push(e);  

push_and_pop(s1,s2);  

}  else

s2.push(e);  

}  //魔王語言的前面部分在棧s2的底部,後面部分在棧s2的頂部,需要轉換一下

while

(!s2.stackempty())  

//上面的操作進行的是第二種解釋規則

//下面的操作進行的是第一種解釋規則

while

(!s.stackempty())  

cout<

<

q.outqueue();  

system("pause"

);  

return

0;  

}  

執行結果如下:

一重括號:

多重括號:

括號不匹配:

資料結構 魔王語言解釋

一 需求分析 1 有乙個魔王總是使用自己的一種非常精煉而抽象的語言講話,沒有人能聽得懂,但他的語言是可以逐步解釋 能聽懂的語言,因為他的語言是由以下兩種形式的規則由人的語言逐步抽象上去的 1 1 2 m 2 1 2 n n n 1 1 在這兩種形式中,從左到右均表示解釋。試寫乙個魔王語言的解釋系統,...

資料結構課程設計 魔王語言解釋

問題描述 有乙個魔王總是使用自己的一種非常精練而又抽象的語言講話,沒有人能聽得懂,但他的語言是可以逐步解釋 能聽懂的語言,因為他的語言是由以下兩種形式的規則由人的語言逐步抽象上去的 1 1 2 m 2 1 2 n n n 1 1 在這兩種形式中,從左到右均表示解釋。試寫乙個魔王語言的解釋系統,把他的...

資料結構 C語言 約瑟夫問題

一 問題描述 約瑟夫問題 乙個旅行社要從n個旅客中選出一名旅客,為他提供免費的環球旅行服務。旅行社安排這些旅客圍成乙個圓圈,從帽子中取出一張紙條,用上面寫的正整數m作為報數值。遊戲進行時,從第s個人開始按順時針方向自1開始順序報數,報到m時停止報數,報m的人被淘汰出列,然後從他順時針方向上的下乙個人...