第一种方法:
#include <iostream>
using namespace std;
typedef char SElemType; // Change SElemType to char for parentheses
#define ERROR 0
#define OK 1
#define MAXSIZE 100
typedef struct {
SElemType *base;
SElemType *top;
int stackSize;
} SqStack;
int InitStack(SqStack &S) {
S.base = new SElemType[MAXSIZE];
if (!S.base)
return ERROR;
S.top = S.base;
S.stackSize = MAXSIZE;
return OK;
}
bool StackEmpty(SqStack S) {
return S.top == S.base;
}
int Push(SqStack &S, SElemType e) {
if (S.top - S.base == S.stackSize) // Stack full
return ERROR;
*S.top++ = e;
return OK;
}
int Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) // Stack empty
return ERROR;
e = *--S.top;
return OK;
}
int GetTop(SqStack &S, SElemType &e) {
if (S.top == S.base)
return ERROR;
e = *(S.top - 1);
return OK;
}
int Matching() {
SqStack s;
SElemType ch;
SElemType x;
int flag = 1;
InitStack(s);
cout << "输入表达式: ";
cin.get(ch); // Read the first character
while (ch != '\n' && flag) { // Continue until newline character is encountered
switch (ch) {
case '[':
case '(':
case '{':
Push(s, ch);
break;
case ')':
if (!StackEmpty(s) && GetTop(s, x) == OK && x == '(')
Pop(s, x);
else
flag = 0;
break;
case ']':
if (!StackEmpty(s) && GetTop(s, x) == OK && x == '[')
Pop(s, x);
else
flag = 0;
break;
case '}':
if (!StackEmpty(s) && GetTop(s, x) == OK && x == '{')
Pop(s, x);
else
flag = 0;
break;
}
cin.get(ch); // Read the next character
}
if (StackEmpty(s) && flag)
return OK;
else
return ERROR;
}
int main() {
if (Matching() == OK)
cout << "括号是平衡的." << endl;
else
cout << "括号不平衡." << endl;
return 0;
}
第二种方法:
#include <iostream>
using namespace std;
typedef int SElemType;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef struct
{
SElemType *base;//存放栈元素
SElemType *top;//栈顶指针
int stackSize;
}SqStack;
//栈的初始化
int InitStack( SqStack &S )
{
S.base =new SElemType[MAXSIZE];
if( !S.base ) return ERROR;
S.top = S.base;
S.stackSize=MAXSIZE;
return OK;
}
//判断栈空
bool StackEmpty(SqStack S)
{
if(S.top == S.base) return true;
else return false;
}
//入栈
int Push( SqStack &S, SElemType e)
{
if( S.top - S.base== S.stackSize ) // 栈满
return ERROR;
//*S.top++=e;
*S.top=e;
S.top++;
return OK;
}
//出栈
int Pop( SqStack &S, SElemType &e)
{
if( S.top == S.base ) // 栈空
return ERROR;
//e= *--S.top;
--S.top;
e=*S.top;
return OK;
}
//取栈顶元素
int GetTop( SqStack S, SElemType &e)
{
if( S.top == S.base ) return ERROR; // 栈空
e = *( S.top-1 );
return OK;
}
int Judge(char *str)
{
SqStack s;
InitStack(s);
int i;
int flag=1;
SElemType e;
//扫描字符串
for(i=0;str[i]!='\0';i++)
{
//如果是左括号( [ {
if(str[i]=='('||str[i]=='['||str[i]=='{')
Push(s,str[i]);//入栈
//如果是右括号
else if(str[i]==')'||str[i]==']'||str[i]=='}')
{
if(!StackEmpty(s)){
//TODO
Pop(s,e);
if(str[i]==')'&&e!='(')
return 0;
if(str[i]==']'&&e!='[')
return 0;
if(str[i]=='}'&&e!='{')
return 0;
}
else
return 0;
}
}
return StackEmpty(s);
}
int main()
{ char *str;
int flag=1;
str=new char(MAXSIZE);
cin>>str;
flag=Judge(str);
if(flag==1) cout<<"匹配";
else cout<<"不匹配";
return 0;
}