括号匹配是栈最典型的应用了。
其实思路很简单,就是遇到一个左括号就压栈,遇到一个右括号就弹栈,看是否匹配就好了。最后检查下栈里是不是有剩余的括号就行了。
上代码~:
//
// main.cpp
// bracketMatch
//
// Created by Alps on 14-7-28.
// Copyright (c) 2014年 chen. All rights reserved.
//
#include <iostream>
#define ElementType char
using namespace std;
struct Node;
typedef Node * PtrToNode;
typedef PtrToNode Stack;
struct Node{
ElementType X;
PtrToNode Next;
};
int isEmpty(Stack S){
return S->Next == NULL;
}
Stack createStack(void){
Stack S;
S = (Stack)malloc(sizeof(Node));
S->Next = NULL;
return S;
}
void Push(Stack S, ElementType X){
Stack element;
element = (Stack)malloc(sizeof(Node));
element->X = X;
element->Next = S->Next;
S->Next = element;
}
void Pop(Stack S){
if (!isEmpty(S)) {
Stack tmp = S->Next;
S->Next = tmp->Next;
free(tmp);
}else{
printf("Empty stack can't pop cell\n");
}
}
ElementType Top(Stack S){
ElementType X;
if (!isEmpty(S)) {
return X = S->Next->X;
}else{
printf("empty stack, no top cell\n");
}
return 0;
}
void makeEmpty(Stack S){
if (S == NULL) {
printf("create stack first\n");
}
while (!isEmpty(S)) {
Pop(S);
}
}
int main(int argc, const char * argv[])
{
Stack S = createStack();
int i = 0;
char tmp;
int flag = 0;
char A[] = {'(','b','c',')','[','{','a','(',')','c','}',']'};
for (i = 0; i < sizeof(A)/sizeof(char); i++) {
if (A[i] == '(' || A[i] == '[' || A[i] == '{') {
Push(S, A[i]);
continue;
}else{
if (A[i] == ')' || A[i] == ']' || A[i] == '}') {
tmp = Top(S);
switch (A[i]) {
case ')':
if (tmp == '(') {
flag = 1;
}
break;
case ']':
if (tmp == '[') {
flag = 1;
}
break;
case '}':
if (tmp == '{') {
flag = 1;
}
break;
default:
break;
}
if (flag != 1) {
printf("the bracket doesn't match! %c-%d\n",A[i],i);
return 1;
}else{
Pop(S);
flag = 0;
}
}else{
continue;
}
}
}
if (!isEmpty(S)) {
printf("there are already some barackets not matched!\n");
return 1;
}else{
printf("the bracket is matched\n");
}
return 0;
}
其实主要流程都在main函数里,我没有变成函数。。。多包涵好了。