顺序栈的应用:括号匹配(内含原理和完整代码实现)

题目: 在表达式中,只有【】和()两种括号,如(【】)【(【】【】)】等为正确格式,【(】)或【()或(()】)均为不正确格式。编写程序检验表达式序列是否正确。

一、分析与算法设计

  1. 检验方法描述:“期待的急迫程度”
  2. 可能出现的不匹配的情况:
    ①到来的有括号不是所“期待的”
    eg (等到了【
    ②盗来的是“不速之客”;
    eg(等到了】
    ③直到结束,也没有到来所“期待”的括号;
    3.算法的设计思想:
    1)凡出现左括号,一律进栈。
    2)凡出现右括号,首先检查栈是否空:
    若栈空,则表明该右括号多于→序列错误
    否则,和栈顶元素比较,
    若相匹配,则“左括号出栈”
    否则表明不匹配,序列错误。
    3)表达式检验结束时,若栈空,则表明表达式中匹配正确,否则表明“左括号”多于→序列错误。

二、代码实现

1.预处理和栈的定义

#include<iostream>
#include<stdlib.h> 
#include<string.h> 
#define Size 20
#define OK 1 
#define ERROR 0 
using namespace std;

typedef struct{
    char *base;
	char *top;
	int stacksize; 
}Stack; 

2.栈的基本操作:

构造空栈:

void InitStack(Stack &S)
{
    S.base=(char *)malloc(Size*sizeof(char));
	if(!S.base)exit(-1);
	S.top=S.base;
	S.stacksize=Size;
	//return OK; 
}

入栈

void Push(Stack &S,char e)
{
	*S.top++=e; 
} 

出栈

int Pop(Stack &S)
{ 
	if(S.top==S.base)return ERROR;
	*--S.top;
	return true; 
} 

取栈顶元素

int getTop(Stack &S,char &e)
{
    if(S.top-S.base==0)return ERROR;
	e=*(S.top-1); 
	return OK; 
} 

判空

int stackEmpty(Stack &S)
{
    if(S.base==NULL)exit(1);
	return S.top-S.base?0:1; 
} 

3.括号匹配子函数:

int matching(Stack &S,char c[]) 
{
	int i=0;
	//int state=1; 
	char e; 
	while(i<strlen(c)) 
	{
	    switch(c[i])
		{
		    case '(':case '[':Push(S,c[i]);break;//凡是左括号,一律入栈 
			case ')':if(getTop(S,e)==0)return ERROR; 
			         if(e=='(')
					 {
					     Pop(S);
						 break;//state=1; 
					 } 
					 else return ERROR; 
			case ']':if(getTop(S,e)==0)return ERROR; 
			         if(e=='[')
					 {
					     Pop(S);
						 break;//state=1; 
					 } 
					 else return ERROR; 
		}  
		i++; 
	} 
	if(stackEmpty(S)) return OK; 
} 

4.主函数:

注:代码中的cout在纯C语言中可改为printf使用;cin可改为scanf使用

int main()
{
    Stack S;
	char c[20];
	cout<<"请输入表达式:";
	cin>>c;
	InitStack(S); 
	int i=0; 
    if(matching(S,c))cout<<"合法"; 
    else cout<<"不合法"; 
	return 0; 
} 

小总结

核心思想:栈的先进后出的性质
关键:注意分类讨论时考虑到每一种情况

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值