資料結構——棧——括號匹配(c++)
阿新 • • 發佈:2018-12-26
同樣是用棧模板寫的,實現上比慕課網上講的簡單一些,沒有定義兩個棧,而是直接判斷是否是左括號,是的話就在MyStack中push另一半括號;如果是右括號且又不是需要的括號,就直接列印不匹配,如果是需要的右括號,就pop掉左括號。最後看mystack中棧頂是否為0,為0則列印括號匹配。
程式碼如下,寫的不好還請大家指出共同討論
demo.cpp
#include <iostream> #include "MyStack.h" using namespace std; int main(void) { MyStack<char> *pStack = new MyStack<char>(30); char *ch, x; int i,flag=1; ch = new char[30]; cin >> ch; char elem; int length = strlen(ch); for (i = 0; i < length; i++) { if (ch[i] == '(' || ch[i] == '[') { pStack->push(ch[i]); } else if (ch[i] == ')') { pStack->pop(ch[i]); if (ch[i] != '(') { cout << "括號不匹配" << endl; flag = 0; } } else if (ch[i] == ']') { elem = pStack->pop(ch[i]); if (ch[i] != '[') { cout << "括號不匹配" << endl; flag = 0; } } } if (pStack->stackLength() != 0) { cout << "括號數量不匹配" << endl; flag = 0; } if (flag == 1) cout << "括號匹配" << endl; }
MyStack.h
#pragma once #include "MyStack.h" #include <iostream> using namespace std; template <typename T> class MyStack { public: MyStack(int size); //分配記憶體初始化棧空間,設定棧容量,棧頂 ~MyStack(); //回收棧空間記憶體 bool stackEmpty(); //判斷棧是否為空,為空返回true,非空返回false bool stackFull(); //判斷棧是否已滿,已滿返回true,不滿返回false void clearStack(); //清空棧 int stackLength(); //已有元素的個數 bool push(T elem);//元素入棧,棧頂上升 bool pop(T &elem);//元素出棧,棧頂下降 void stackTravers(); //遍歷棧中所有元素 private: T *m_stack; //棧空間指標 int m_iSize; //棧容量 int m_iTop; //棧頂,棧中元素數量 }; template <typename T>//每一個函式前面都要加 MyStack<T>::MyStack(int size) { m_iSize = size; m_stack = new T[size]; m_iTop = 0;//當前的棧是一個空棧,空棧,棧頂為零 } template <typename T> MyStack<T>::~MyStack() { delete[]m_stack;//釋放陣列的記憶體 } template <typename T> bool MyStack<T>::stackEmpty() { if (0 == m_iTop)//更加高質量 { return true; } return false; } template <typename T> bool MyStack<T>::stackFull() { if (m_iTop == m_iSize)//寫成>=一樣 { return true; } return false; } template <typename T> void MyStack<T>::clearStack() { m_iTop = 0;//令棧頂復原,就算原來的棧裡有值,下一次賦值也會進行覆蓋 } template <typename T> int MyStack<T>::stackLength() { return m_iTop; } template <typename T> bool MyStack<T>::push(T elem)//一定要放在棧頂 { if (stackFull()) { //可以用throw來丟擲異常 return false; } m_stack[m_iTop] = elem; m_iTop++;//此時棧頂指向的是一個空位置 return true; } template <typename T> bool MyStack<T>::pop(T &elem)//傳入的是一個引用 { if (stackEmpty()) { return false; } m_iTop--;//將棧頂降低至實際的棧頂 elem = m_stack[m_iTop]; return true; } //void MyStack::stackTravers(visit())複雜的棧需要一個函式做指標來遍歷 template <typename T> void MyStack<T>::stackTravers() { for (int i = 0; i < m_iTop; i++) { //m_stack[i].Coorprint(); cout << m_stack[i]; } }