数据结构判断括号匹配是否成功


/*对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是
相互匹配的。设计算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
*/
#include
#include
#include
using namespace std;
#define max 100
typedef int element;
typedef struct sStack {
    element data[max];
    int top;
}seqStack;
void initialStack(seqStack& S) {
    S.top = -1;
}
bool stackFull(seqStack& S) {//判断栈满
    if (S.top == max - 1)
        return true;
    else
        return false;
}
bool stackEmpty(seqStack& S) {//判断栈空
    if (S.top == -1)
        return true;
    else
        return false;
}
bool stackTop(seqStack& S, element& x) {//取栈顶元素
    if (stackEmpty(S))
        return false;
    else {
        x = S.data[S.top];
        return true;
    }
}

 bool pushStack(seqStack& S, element x) {//入栈
    if (stackFull(S))
        return false;
    else {
        S.top++;
        S.data[S.top] = x;
        return true;
    }
}
bool popStack(seqStack& S, element x) {
    if (stackEmpty(S))
        return false;
    else {
        x = S.data[S.top];
        S.top--;
        return true;
    }
}
bool isSame(char a, char b) {
    if (a == '(' && b == ')')
        return true;
    else if (a == '{' && b == '}')
        return true;
    else if (a == '[' && b == ']')
        return true;
    else
        return false;
}
int main() {
    seqStack  S;
    initialStack(S);
     cout << "输入算数表达式:";
    char a[100];
    gets_s(a);
    char* p = a;
    element x;
    while (*p) {
        switch (*p) {
        case'(':
        case'[':
        case'{':
            pushStack(S, *p++);
            break;
        case')':
        case']':
        case'}':
            if (stackEmpty(S)) {
                cout << "缺少左括号" << endl;
                return 0;
            }
            else {
                stackTop(S, x);
                if (isSame(*p,x))
                    popStack(S, x);
                else
                    cout << "匹配不成功";
                return 0;
             }
        default: p++;
        }
     }
    if (stackEmpty(S))
        cout << "匹配成功!";
    else
        cout << "匹配不成功";
    return 0;
 }

想问一下,这里为什么明明是匹配的但是显示不匹配

img