1. 程式人生 > 其它 >Linux Samba伺服器配置

Linux Samba伺服器配置

技術標籤:雜學

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
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))。

練習題