#include <stdio.h>
//宏定义
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//类型定义
typedef char SElemType;
typedef int Status;
typedef int BOOL;
//栈单元结构定义
typedef struct SNode
{
SElemType data;
struct SNode *next;
}*LinkSNode;
//栈结构定义
typedef struct
{
LinkSNode top; //栈顶指针
}*LinkStack;
//初始化栈
Status InitStack(LinkStack S)
{
S->top=NULL;
return OK;
}
//销毁栈
Status DestroyStack(LinkStack S)
{
if(NULL==S)
{
printf("错误!栈已被销毁!\n");
return ERROR;
}
free(S);
return OK;
}
//清空栈
Status ClearStack(LinkStack S)
{
LinkSNode p;
if(NULL==S->top)
{
printf("错误!栈已被清空!\n");
return ERROR;
}
while(NULL!=S->top)
{
p=S->top;
S->top=S->top->next;
free(p);
}
return OK;
}
//获取栈顶元素
Status GetTop(LinkStack S,SElemType *e)
{
if(NULL==S->top)
{
printf("获取错误!栈已空!\n");
return ERROR; //如果栈为空,返回ERROR
}
*e=S->top->data; //栈不为空则把栈顶元素赋值给e
return OK;
}
//判断栈是否为空
BOOL IsEmpty(LinkStack S)
{
if(NULL!=S->top) return FALSE;
return TRUE;
}
//压栈
Status Push(LinkStack S,SElemType e)
{
LinkSNode new_node=(LinkSNode)malloc(sizeof(LinkSNode));
if(NULL==new_node)
{
printf("内存不足,压栈失败!\n");
return ERROR;
}
new_node->data=e;
new_node->next=S->top;
S->top=new_node;
return OK;
}
//出栈
Status Pop(LinkStack S,SElemType *e)
{
LinkSNode p=S->top;
if(NULL==S->top)
{
printf("出栈失败!栈已空!\n");
return ERROR; //如果栈为空,返回ERROR
}
//栈不为空则出栈
*e=S->top->data;
S->top=S->top->next;
free(p);
return OK;
}
//判断是否为左括弧
BOOL IsLeft(char ch)
{
switch(ch)
{
case '(':
case '[':
case '{':
return TRUE;
case ')':
case ']':
case '}':
return FALSE;
}
return FALSE;
}
//判断左括弧和右括弧是否匹配
BOOL IsMatch(char ch_l,char ch_r)
{
if(ch_l=='('&&ch_r==')')
{
return TRUE;
}
if(ch_l=='['&&ch_r==']')
{
return TRUE;
}
if(ch_l=='{'&&ch_r=='}')
{
return TRUE;
}
return FALSE;
}
//括弧匹配函数
Status Brackets_Match(LinkStack S)
{
char e; //用于接收出栈元素的值
char ch; //用于接收用户输入
ch=getchar();
do
{
if(TRUE==IsLeft(ch))
{
Push(S,ch);
}
else if(FALSE==IsEmpty(S)&&TRUE==IsMatch(S->top->data,ch))
{
Pop(S,&e);
}
else if(FALSE==IsEmpty(S)&&FALSE==IsMatch(S->top->data,ch))
{
printf("左右括弧不匹配!\n");
return ERROR;
}
else if(FALSE==IsLeft(ch))
{
printf("右括弧多余!\n");
return ERROR;
}
ch=getchar();
}while('\n'!=ch);
if(FALSE==IsEmpty(S))
{
printf("左括弧多余!\n");
return ERROR;
}
else
{
printf("括弧匹配成功!\n");
}
return OK;
}
//主函数
int main()
{
char e;
LinkStack S=(LinkStack)malloc(sizeof(LinkStack));
InitStack(S);
Brackets_Match(S);
return 0;
}
括弧匹配
最新推荐文章于 2024-07-19 16:13:00 发布