括号匹配(基于链栈)

31 篇文章 1 订阅
8 篇文章 0 订阅

括号匹配只需要在链栈的基础上增加括号匹配函数:

void matching(Stack *st);//括号匹配
int Match(ElemType e,ElemType ch);


函数如下:

int Match(ElemType e,ElemType ch)
{
	if(e == '(' && ch == ')')
	{
		return 1;
	}
	else if(e == '[' && ch == ']')
	{
		return 1;
	}
	else if(e == '{' && ch == '}')
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

void matching(Stack *st)
{
	char *p;
	ElemType e;
	ElemType ch[100];
	InitStack(st);
	cout<<"请输入带括号的表达式('{}','[]','()')"<<endl;
	gets(ch);
	p = ch;
	while(*p)//单个字符处理
	{
		switch(*p)
		{
		case '(':
		case '[':
		case '{':
			push(st,*p++);
			break;
		case ')':
		case ']':
		case '}':
			if(StackEmpty(st))
			{
				cout<<"缺少左括号"<<endl;
				return;
			}
			else
			{
				e = GetTop(st);
				if(Match(e,*p))
				{
					pop(st);
				}
				else
				{
					cout<<"左右括号不配对"<<endl;
					return;
				}
			}
		default:
			p++;
		}
	}
	if(StackEmpty(st))
	{
		cout<<"左右括号配对"<<endl;
	}
	else
	{
		cout<<"缺少右括号"<<endl;
	}
}


具体函数如下:

头文件:

#ifndef _STACK_H
#define _STACK_H

#include<iostream>
#include<assert.h>
using namespace std;

#define ElemType char

typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node,*PNode;

typedef struct Stack
{
	PNode top;
	PNode rear;
	size_t size;
}Stack;

int StackEmpty(Stack *st);
void InitStack(Stack *st);//初始化
bool push(Stack *st,ElemType x);//尾插
bool pop(Stack *st);//头删
void ShowStack(Stack *st);//打印
void clear(Stack *st);//清除
void destroy(Stack *st);//摧毁
int length(Stack *st);//长度
ElemType GetTop(Stack *st);//栈顶元素
void matching(Stack *st);//括号匹配
int Match(ElemType e,ElemType ch);

#endif


函数定义函数:

#include "Stack.h"

int StackEmpty(Stack *st)
{
	if(st->size == 0)
	{
		return 1;
	}
	return 0;
}

void InitStack(Stack *list)//初始化
{
	Node* s = (Node*)malloc(sizeof(Node));
	assert(s != NULL);
	s->next = NULL;
	list->rear = list->top = s;
	list->size = 0;
}

bool push(Stack *st, ElemType x)//尾插
{
	Node *p = (Node*)malloc(sizeof(Node));
	assert(p != NULL);
	p->data = x;
	p->next = st->top->next;
	st->top->next = p; 
	st->size++;
	return true;
}

void ShowStack(Stack *st)//打印
{
	Node *p = st->top->next ;
	cout<<"NULL"<<endl;
	while(p != NULL)
	{
		cout<<p->data <<endl;
		p = p->next ;
	}
}

bool pop(Stack *st)//头删
{
	if(StackEmpty(st))
	{
		cout<<"栈已空,不能出栈!"<<endl;
		return false;
	}
	Node *p = st->top->next;
	if(st->size == 1)
	{
		free(p);
		st->top->next = NULL;
		st->rear = st->top;
	}
	else
	{
		st->top->next = p->next ;
		free(p);
	}
	st->size--;
	return true;
}

ElemType GetTop(Stack *st)//栈顶元素
{
	if(StackEmpty(st))
	{
		printf("栈已空,没有栈顶元素!\n");
		return -1;
	}
	return st->top->next->data;
}
void clear(Stack *st)//清除
{
	Node *p = st->top->next;
	while(p != NULL)
	{
		st->top->next = p->next;
		free(p);
		p = st->top->next;
	}
	st->rear  = st->top ;
	st->size  = 0; 
}

void destroy(Stack *st)//摧毁
{
	clear(st);
	free(st->top);
	st->top = st->rear = NULL;
}

int length(Stack *st)//长度
{
	return st->size ;
}

int Match(ElemType e,ElemType ch)
{
	if(e == '(' && ch == ')')
	{
		return 1;
	}
	else if(e == '[' && ch == ']')
	{
		return 1;
	}
	else if(e == '{' && ch == '}')
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

void matching(Stack *st)
{
	char *p;
	ElemType e;
	ElemType ch[100];
	InitStack(st);
	cout<<"请输入带括号的表达式('{}','[]','()')"<<endl;
	gets(ch);
	p = ch;
	while(*p)//单个字符处理
	{
		switch(*p)
		{
		case '(':
		case '[':
		case '{':
			push(st,*p++);
			break;
		case ')':
		case ']':
		case '}':
			if(StackEmpty(st))
			{
				cout<<"缺少左括号"<<endl;
				return;
			}
			else
			{
				e = GetTop(st);
				if(Match(e,*p))
				{
					pop(st);
				}
				else
				{
					cout<<"左右括号不配对"<<endl;
					return;
				}
			}
		default:
			p++;
		}
	}
	if(StackEmpty(st))
	{
		cout<<"左右括号配对"<<endl;
	}
	else
	{
		cout<<"缺少右括号"<<endl;
	}
}


测试函数

#include "Stack.h"

void main()
{
	Stack mystack;
	InitStack(&mystack);
	matching(&mystack);
}


此函数对于一个字符串进行括号匹配操作,操作简单,且测试容易,故不进行执行截图。希望大家能够提出建议,谢谢。




在最近学习中,发展可以不使用switch即可完成括号匹配操作,具体代码如下:

bool Check(const char *str)
{
	Stack st;                            //定义栈
	InitStack(&st);                      //初始化
	while(*str != '\0')                  //字符串结束标志
	{ 
	  	if(*str == '[' || *str == '(')   //为左括号
		{
			push(&st,*str);              //入栈
		}
		else if(*str == ']')             //分别判断
		{
			if(GetTop(&st) != '[')       //是否匹配
			{
				return false;
			}
			else
			{
				pop(&st);                 //匹配出栈
			}
		}
		else if(*str == ')')              //同上
		{
			if(GetTop(&st) != '(')
			{
				return false;
			}
			else
			{
				pop(&st);
			}
		}
		str++;                            //字符指针后移
	}
	return StackEmpty(&st);               //判断栈是否为空,为空即匹配成功
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值