實驗三 用棧ADT應用 對稱符號匹配判斷

2021-10-04 18:50:34 字數 4123 閱讀 7062

輸入一行符號,以#結束,判斷其中的對稱符號是否匹配。對稱符號包括:

輸出分為以下幾種情況:

(1)對稱符號都匹配,輸出 「 right. 「

(2) 如果處理到最後出現了失配,則輸出兩行:

第一行:matching failure.

第二行:loss of right character $$....

其中$$... 是按巢狀順序對應的右匹配符號。

(3)處理到某個符號時失配了,則輸出兩行或三行:

第一行: the n character '$' is wrong." ,

其中n是出錯符號的序號,$是出錯的符號;

第二行: loss of left character $.」

其中 $ 是當前符號的左匹配符號。

第三行:(如果有的話)loss of right character $$...」

其中$$... 是按巢狀順序對應的右匹配符號。

測試用例

用例一:

輸入

as(*x<))}>)#

輸出:

right.

用例二:

輸入:

(a.b)>#

輸出:

the 6 character 『>』 is wrong.

loss of left character <.

因為隱藏用力比較多,博主也尋找了很多隱藏用例,因此這裡給出兩個博主自己摸索的用例。這也用例也都滿足,ac的概率更高一點

自創用例一:

輸入:

>}#

輸出:

the 4 character 『>』 is wrong.

loss of left character <.

loss of right character }>}.

自創用例二:

輸入:

#輸出:

matching failure.

loss of right character }}.

其實我這裡自己寫的也比較亂,做了一下午腦袋嗡嗡的。有幾個要注意的坑:

1.對「棧」的理解;

之前看過乙個博主寫的非常好,我的印象很深刻。他說,棧就像乙個口袋,先放進去的在最底下,只能最後取出來。最後放進去的在最頂上,能最先取出來。

我的棧定義寫了

變數:

存放棧元素的陣列 elemtype *elements;

棧頂指示器top,並賦初值為-1(執行程式的時候因為沒賦初值報錯了)

棧的最大容量maxsize

方法

棧的溢位處理void overflowprocess();

進棧 void push(elemtype x);

出棧 bool pop (elemtype x);

判斷棧是否為空 bool isempty()const;

判斷棧是否棧滿 bool isfull();

取棧頂內容 bool gettop(elemtype &x);

得到棧的容量 int getsize()const;

棧置空void makeempty();

其中本題只用到了進棧,出棧、判斷棧是否為空,棧制空(析構函式中)

2.本題難點

這個題我覺得最難的地方是考慮多種失配情況。

這個題的中心思路是:

將輸入的字串進行比對,壓進棧中→分析多種情況得到輸出

(可能是我的演算法太差了,我輸出這裡真是一言難盡,搞了好久)

(1)壓棧時,左側符號-(

seqstack

(int sz)

;//建構函式

~seqstack()

void

push

(elemtype x)

;//進棧

bool

pop(elemtype x)

;//出棧

bool

gettop

(elemtype &x)

;//取棧頂內容

bool

isempty()

const

bool

isfull()

const

intgetsize()

const

void

makeempty()

//friend ostream&operator<<(ostream &os,seqstack &s); //過載運算子<<};

seqstack::

seqstack

(int sz)

//建構函式

void seqstack::

overflowprocess()

maxsize+

=maxsize;

//棧空間擴大

delete

elements;

//釋放原來的連續空間

elements=newarray;

//改變elements指標

}void seqstack::

push

(elemtype x)

bool seqstack::

pop(elemtype x)

intmain()

if(str[i]

=='[')if

(str[i]

=='<')if

(str[i]=='

if(str[i]

==')'

)else

//如果棧頂不適配,那麼就有錯,記下來這個符號然後break;

}else

//如果棧是空的,那麼就錯了}if

(str[i]

==']'

)else

}else

//如果棧是空的}if

(str[i]

=='>'

)else

}else

//如果棧是空的}if

(str[i]

=='}'

)else

}else

//如果棧是空的

} i++;}

if(s.

isempty()

==true

)//空棧時

else

if(right1!=0)

//其他情況都是不適配。

//輸出缺失的左側運算子

if(you==

')')

if(you==

'}')

if(you==

']')

cout<<

"."

//沒空棧時

else

if(countit!=0)

if(cun==

')')

if(cun==

'}')

if(cun==

']')

cout<<

"."<} cout<<

"loss of right character "

;while

(s.isempty()

!=true)"

; s.

pop('if

(s.elements[s.top]

=='(')if

(s.elements[s.top]

=='[')if

(s.elements[s.top]

=='<')}

cout<<

"."<}return0;

}**寫的有點亂,思路也比較亂,如果發現錯誤歡迎批評指正

棧ADT應用 對稱符號匹配判斷

輸入一行符號,以 結束,判斷其中的對稱符號是否匹配。對稱符號包括 輸出分為以下幾種情況 1 對稱符號都匹配,輸出 right.2 如果處理到最後出現了失配,則輸出兩行 第一行 matching failure.第二行 loss of right character 其中 是按巢狀順序對應的右匹配符號...

實驗三 棧與佇列的應用

1 依據順序棧儲存結構的定義如下 利用以下的常用操作設計演算法並實現完成2 3題 define maxsize 100 typedef char selemtype typedef struct sqstack 除錯並測試常用操作如下 intinitstack sqstack s intstacke...

實驗三 順序棧的基本操作實現及其應用

1 熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。2 學會使用棧和佇列解決實際問題。二 實驗內容 棧的壓棧和出棧操作。三 include using namespace std const int stacksize 20 陣列長度為20 templateclass seqs...