亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

自己寫的一個單棧括號匹配,支持干擾字符

#include?<iostream>
#include?"Stack.h"

using?std::string;
using?std::cout;
using?std::endl;

/**
?*?檢測字符串中的括號是否匹配
?*?@param?str?待檢測匹配的字符串
?*?@param?tps1?匹配的符號
?*?@param?tps2?與tps1相匹配且順序一致的符號
?*?@return?括號是否匹配的布爾值
?*/
bool?isPaired(string?str,?string?tps1,?string?tps2);

int?main()?{
????string?s?=?"int?main(){func(){while(true){cout?<<?endl}}}";????//待檢測字符串
????string?msg;
????msg?=?isPaired(s,?"({[",?")}]")???"OK"?:?"No";
????cout?<<?msg?<<?endl;
????return?0;
}

bool?isPaired(string?str,?string?tps1,?string?tps2)?{
????Stack<char>?stack(str.length()?/?2);??//如果字符串中的括號匹配,最差情況下棧需要的長度等于字符串長度的一半
????int?tps_pos;
????char?tmp;
????for?(char?i?:?str)?{
????????if?(tps1.find(i)?!=?-1)?{???//棧存儲字符串中的左括號
????????????if?(stack.isFull())
????????????????return?false;
????????????stack.push(i);
????????}?else?if?((tps_pos?=?tps2.find(i))?!=?-1)?{
????????????if?(stack.isEmpty())
????????????????return?false;
????????????stack.pop(tmp);
????????????if?(tps1[tps_pos]?!=?tmp)?{????//判斷字符串的某一右括號字符對應匹配的左括號是否與當前pop出的元素是否一致
????????????????return?false;
????????????}
????????}
????}
????return?stack.isEmpty();?//判斷是否棧空,如果棧為空則說明匹配完畢,如果未空則說明有括號未匹配
}

好吧,這不是一個提問。只是一個代碼片段分享,評論區不支持語法高亮就發問答區了。

正在回答

2 回答

我也來分享一下,兄弟不會介意吧。和你寫的有點不同,也支持干擾字符!

MyStack<char>?*pStack?=?new?MyStack<char>(30);
?int?flag?=?0;
?char?elem;
?char?str[]?=?"[cfg(2sdf*2ds)f]";
?for?(int?i?=?0;i?<?strlen(str);i++)
?{
??switch?(str[i])
??{
??case?'(':
??case?'[':
???pStack->push(str[i]);
???break;
??case?')':??
???if?(!pStack->pop(elem))
???{
????flag?=?1;
????continue;
???}
???if?(elem?!=?'(')
???{
????flag?=?1;
???}
???break;
??case?']':
???if?(!pStack->pop(elem))
???{
????flag?=?1;
????continue;
???}
???if?(elem?!=?'[')
???{
????flag?=?1;
???}
???break;
??}
?}
?if?(!pStack->stackEmpty()?||?1?==?flag)
?{
??cout?<<?"字符串括號不匹配"?<<?endl;
?}
?else
?{
??cout?<<?"字符串括號匹配"?<<?endl;
?}


1 回復 有任何疑惑可以回復我~

#include?<iostream>

#include?"Stack.h"

?

using?std::string;

using?std::cout;

using?std::endl;

?

/**

?*?檢測字符串中的括號是否匹配

?*?@param?str?待檢測匹配的字符串

?*?@param?tps1?匹配的符號

?*?@param?tps2?與tps1相匹配且順序一致的符號

?*?@return?括號是否匹配的布爾值

?*/

bool?isPaired(string?str,?string?tps1,?string?tps2);

?

int?main()?{

????string?s?=?"int?main(){func(){while(true){cout?<<?endl}}}";????//待檢測字符串

????string?msg;

????msg?=?isPaired(s,?"({[",?")}]")???"OK"?:?"No";

????cout?<<?msg?<<?endl;

????return?0;

}

?

bool?isPaired(string?str,?string?tps1,?string?tps2)?{

????Stack<char>?stack(str.length()?/?2);??//如果字符串中的括號匹配,最差情況下棧需要的長度等于字符串長度的一半

????int?tps_pos;

????char?tmp;

????for?(char?i?:?str)?{

????????if?(tps1.find(i)?!=?-1)?{???//棧存儲字符串中的左括號

????????????if?(stack.isFull())

????????????????return?false;

????????????stack.push(i);

????????}?else?if?((tps_pos?=?tps2.find(i))?!=?-1)?{

????????????if?(stack.isEmpty())

????????????????return?false;

????????????stack.pop(tmp);

????????????if?(tps1[tps_pos]?!=?tmp)?{????//判斷字符串的某一右括號字符對應匹配的左括號是否與當前pop出的元素是否一致

????????????????return?false;

????????????}

????????}

????}

????return?stack.isEmpty();?//判斷是否棧空,如果棧為空則說明匹配完畢,如果未空則說明有括號未匹配

}


1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
數據結構探險—棧篇
  • 參與學習       62770    人
  • 解答問題       105    個

棧,先入后出(FILO),帶領大家體會棧這種數據結構的美妙

進入課程

自己寫的一個單棧括號匹配,支持干擾字符

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號