Linux Samba伺服器配置
阿新 • • 發佈:2021-01-27
技術標籤:雜學
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
1. 左括號必須用相同型別的右括號閉合。
2. 左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
輸入樣例:
()
[]
()[]{}
(]
([)]
輸出樣例:
true
true
true
false
true
false
思路:
接收字串然後對其進行遍歷
①如果遇到左括號,則左括號入棧
②如果遇到右括號,則與棧頂元素進行匹配
- 若匹配成功則棧頂元素出棧
- 若匹配失敗則返回false
③最後檢查棧是否為空。若棧空則返回true,否則返回false
程式碼:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
//判斷棧頂字元與當前字元是否匹配
bool ispair(char a,char b)
{
if (a == '(' && b == ')' ) return true;
if (a == '[' && b == ']' ) return true;
if (a == '{' && b == '}' ) return true;
//若不屬於以上三種情況,則返回false
return false;
}
int main()
{
//C++中的string等價於C語言中的字元陣列
string s;
while (getline(cin,s))
{
if (s.empty())
{
//空字串預設匹配
cout << "true" << endl;
continue;
}
else
{
//若字串非空則利用棧進行判斷
stack<char> st;
//將第一個字元入棧
st.push(s[0]);
//從第二個字元開始判斷
for (int i = 1; i < (int)s.size(); i++)
{
//如果棧非空且當前元素與棧頂元素匹配,則棧頂元素出棧否則入棧
if ( !st.empty() && ispair(st.top(),s[i]) ) st.pop();
else st.push(s[i]);
}
//遍歷完字元之後判斷棧是否為空
if (st.empty()) cout << "true" << endl;
else cout << "false" << endl;
}
}
}
執行結果
注意:若使用while(cin >> s),則無法讀入空字元,即在輸入時直接按回車,應當輸出true,但是oj輸出false,無法AC題目,故此處必須使用while(getline(cin,s))。