案例3.2:括號匹配的檢驗(c++實現/資料結構/棧的基本操作)
阿新 • • 發佈:2018-12-11
#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status; typedef struct StackNode { ElemType data; struct StackNode *next; }StackNode, *LinkStack; Status InitStack(LinkStack &S) { S = NULL; return OK; } /*入棧*/ Status Push(LinkStack &S,ElemType e) { LinkStack p; p = new StackNode; p->data = e; p->next = S; S = p; return OK; } /*彈出棧頂元素*/ Status Pop(LinkStack &S, ElemType &e) { LinkStack p; e = S->data; p = S; S = S->next; delete p; return OK; } /*判斷是否棧空,是返回1,否返回0*/ Status StackEmpty(LinkStack S) { if (S == NULL)return OK; else return ERROR; } /*獲取棧頂元素的值,不修改指標*/ Status GetTop(LinkStack S) { if (S != NULL)return S->data; } Status Matching(LinkStack &S) { ElemType ch, e; int flag; InitStack(S); flag = 1; cin >> ch; while (ch != '#'&&flag) { switch (ch) { case '[': case '(':Push(S, ch); break; case ')': if (!StackEmpty(S) && GetTop(S) != '[') Pop(S, e); else flag = 0; break; case ']': if (!StackEmpty(S) && GetTop(S) == '[') Pop(S, e); else flag = 0; break; } cin >> ch; } if (StackEmpty(S) && flag)return OK; else return ERROR; } int main() { LinkStack S, p; if (Matching(S)) cout << "匹配成功!\n"; else { cout << "匹配失敗!\n"; } p = S; while (p) { cout << p->data; p = p->next; } system("pause"); return 0; }