用栈求括号是否匹配总是匹配不成功


/*对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是
相互匹配的。设计算法对以字符串形式读入的表达式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 != ' ') {
        if (*p == '(' || *p == '[' || *p == '{') {
            pushStack(S, *p);
            p++;
            continue;
        }
        if (*p == ')' && S.data[S.top] == '(') {
            popStack(S, x);
            p++;
            continue;
        }
        else if (*p == '[' && S.data[S.top] == ']') {
            popStack(S, x);
            p++;
            continue;
        }
        else if (*p == '{' && S.data[S.top] == '}') {
            popStack(S, x);
            p++;
            continue;
        }
        else break;
    }
    if (stackEmpty(S)&&*p==' ')
        cout << "匹配成功!" << endl;
    else
        cout << "匹配不成功" << endl;
    return 0;
} 

img


想问一下为什么是这一点结果,我感觉检查了没问题

修改如下:

/*对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是
相互匹配的。设计算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
 */
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
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 != '\0') {
        if (*p == '(' || *p == '[' || *p == '{') {
            pushStack(S, *p);
            p++;
            continue;
        }
        if (*p == ')' && S.data[S.top] == '(') {
            popStack(S, x);
            p++;
            continue;
        }
        else if (*p == '[' && S.data[S.top] == ']') {
            popStack(S, x);
            p++;
            continue;
        }
        else if (*p == '{' && S.data[S.top] == '}') {
            popStack(S, x);
            p++;
            continue;
        }
        else 
        {
            p++;
            continue;
        }
    }
    if (stackEmpty(S)&&*p=='\0')
        cout << "匹配成功!" << endl;
    else
        cout << "匹配不成功" << endl;
    system("pause");
    return 0;
} 

 
/*对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是
相互匹配的。设计算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
 */
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
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 != '=') { //改!
        if (*p == '(' || *p == '[' || *p == '{') {
            pushStack(S, *p);
            p++;
            continue;
        }
        if (*p == ')' && S.data[S.top] == '(') {
            popStack(S, x);
            p++;
            continue;
        }
        else if (*p == '[' && S.data[S.top] == ']') {
            popStack(S, x);
            p++;
            continue;
        }
        else if (*p == '{' && S.data[S.top] == '}') {
            popStack(S, x);
            p++;
            continue;
        }
        p++; //else break; 改!
    }
    if (stackEmpty(S)&&*p=='=') //改!
        cout << "匹配成功!" << endl;
    else
        cout << "匹配不成功" << endl;
    return 0;
}