用鏈棧實現字串表示式括號匹配演算法

2021-08-04 13:46:48 字數 2946 閱讀 4031

字串表示式括號匹配演算法思路

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個。輸入 一行資料,即表示式。...