字串表示式括號匹配演算法思路:
1、遍歷字串中的字元,遇到左括號字元先壓入棧,遇到右括號,棧頂字元出棧與之進行比較,如果配對則繼續迴圈遍歷下一字元,否則就返回不匹配。例如:(6*3]
2、遍歷過程中,若棧為空,但當前字元是右括號時,則返回匹配失敗。例如:(7-1))
3、遍歷完字串後,若發現棧不為空,則返回不匹配。例如:(5/2
4、從第二個字元遍歷開始,如果當前字元是數字,則前乙個字元如果是右括號,則返回不匹配。例如:(6+)5
5、如字串中沒有括號時,返回匹配失敗。例如:5+3
注意:預設不包含其他字元,例如空格,特殊字元等等。匹配成功列印yes,匹配失敗列印no。測試記憶體洩漏,windows安裝visual leak detect,linux安裝valgrind。
gcc編譯:
g++ -g -o .test_str_bracket_match test_str_bracket_match.cpp -std=c++11
檢測記憶體問題:
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes ./test_str_bracket_match
link_stack.h
#ifndef __link_stack_h_2020_11_25__
#define __link_stack_h_2020_11_25__
#include #include #include using namespace std;
templateclass linkstack node;
linkstack():size_(0), head_(nullptr)
void push(t val)
node* new_node = new (nothrow) node;
if (nullptr == new_node) exit(1);
new_node->data = val;
new_node->next = head_->next;
head_->next = new_node;
++size_;
} void pop()
if (0 == size_)
node* first_node = head_->next;
if (nullptr == first_node)
head_->next = first_node->next;
delete first_node;
first_node = nullptr;
--size_; }
t top()
if (empty())
else
} bool empty()
return 0 == size_ || nullptr == head_->next;
} size_t size()
return size_;
} node* at()
return head_->next; }
void clear()
~linkstack()
protected:
void _init()
head_ = new (nothrow) node;
if (nullptr == head_) exit(1);
memset(head_, 0, sizeof(node));
} void _uninit()
if (0 < size_)
if (0 != size_)
head_->next = nullptr;
} }private:
size_t size_;
node* head_;
};templatevoid show(linkstack& sta)
typedef typename linkstack::node node;
node* p = sta.at();
while (nullptr != p)
cout << endl;
}#endif // linkstack
test_link_stack.cpp
#include "link_stack.h"
#ifdef _win32
#include "vld.h"
#endif
int main()
show(sta);
return 0;
}
test_str_bracket_match.cpp
#include "link_stack.h"
#include #include using namespace std;
bool ismatch(const string& str, linkstack& sta) ' == prev_char)
}} if ('(' == cur_char || '[' == cur_char || '
else ' == cur_char)
}else ' == cur_char))
}} }
if (!sta.empty() || !has_bracket)
return true;
}int main() ";
linkstacksta;
bool res = ismatch(str, sta);
if (res)
else
return 0;
}
表示式括號匹配(棧)
鏈結 假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於255,左圓括號少於20個。一行 表示式 一行 yes 或 no 輸入 1複製 2 x y 1 x 輸出...
棧實現字串表示式計算
最近頻繁解決計算方面的問題,其中就有實現字串表示式計算返回結果值需求,通過使用棧實現,需要定義運算符號優先順序,其它就不細說,如下 csstack.cs using system namespace pyhb 設定棧大最大容量 public void initialize int size 入棧 p...
棧的應用 表示式括號匹配
時間限制 1000 ms 記憶體限制 65536 kb 假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於255,左圓括號少於20個。輸入 一行資料,即表示式。...