出處:
[問題描述]
有乙個魔王總是使用自己的一種非常精練而又抽象的語言講話,沒有人能聽得懂,但他的語言是可以逐步解釋**能聽懂的語言,因為他的語言是由以下兩種形式的規則由人的語言逐步抽象上去的:
(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的人被淘汰出列,然後從他順時針方向上的下乙個人...