#include<iostream>
const int Stack_Size = 30;
const int TRUE = 1;
const int FALSE = 0;
typedef struct //定义顺序栈结构
{
char data[Stack_Size];
int top; //栈顶指针
}SqStack;
void BracketMatch(char *);
int Match(char, char);
/*初始化,构造一个空栈S*/
void InitStack(SqStack *S)
{
S->top = -1;
}
/*判断栈是否为空,为空时返回真,否则返回假*/
int IsStackEmpty(SqStack *S)
{
return (S->top == -1?TRUE:FALSE);
}
/*判断栈是否已满,满时返回真,否则返回假*/
int IsStackFull(SqStack *S)
{
return (S->top == Stack_Size-1?TRUE:FALSE);
}
/*取栈顶元素, 只取元素,栈顶指针不变*/
int GetTop(SqStack *S, char *e)
{
if(S->top == -1) //判断栈空
return FALSE;
*e = S->data[S->top];
return TRUE;
}
/*入栈操作*/
int Push(SqStack *S, char e)
{
if(S->top == Stack_Size-1) //判断栈满
return FALSE;
S->top++;
S->data[S->top] = e;
return TRUE;
}
/*出栈操作*/
int Pop(SqStack *S, char *e)
{
if(S->top == -1) //判断栈空
return FALSE;
*e = S->data[S->top];
S->top--;
return TRUE;
}
int main()
{
char str[50];
std::cout<<"请输入表达式:";
gets(str);
BracketMatch(str);
return 0;
}
/*括号匹配算法*/
void BracketMatch(char *str)
{
int i;
char ch;
SqStack S;
InitStack(&S);
for(i=0; str[i]!='\0'; i++)
{
switch(str[i])
{
case '(':
case '[':
case '{':
Push(&S, str[i]); //遇左括号就入栈
break;
case ')':
case ']':
case '}':
if(IsStackEmpty(&S)) //栈空
{
std::cout<<"右括号多余!\n";
return;
}
else
{
GetTop(&S, &ch); //栈不为空,取栈顶元素
if(Match(ch, str[i])) //比较两括号是否匹配,若匹配,则左括号出栈
Pop(&S, &ch);
else
{
std::cout<<"括号类型不匹配!\n";
return;
}
}
break;
default: break;
}
}
if(IsStackEmpty(&S))
std::cout<<"括号匹配!\n";
else
std::cout<<"左括号多余!\n";
}
/*检查两括号是否匹配*/
int Match(char str1, char str2)
{
if(str1=='(' && str2==')')
return TRUE;
else if(str1=='[' && str2==']')
return TRUE;
else if(str1=='{' && str2=='}')
return TRUE;
else
return FALSE;
}
顺序栈的括号匹配算法
最新推荐文章于 2022-06-21 20:25:42 发布