C数据结构学习历程(4) 链栈之 括号匹配

我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《严蔚敏c数据结构视频》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。

因为有注释,我直接copy代码了。也参考了关联的文章   “数据结构实验之栈四:括号匹配

#include<iostream>
using namespace std;
#define OK 1
#define ERROR -1
#define MAX_SIZE 100
typedef int Status; 
typedef char ElemType;
typedef struct Stack_Node    //链栈的结点类型说明
{
	ElemType data;
	struct Stack_Node *next;
}StackNode;
StackNode *Init_Link_Stack()
{
	StackNode * top;
	top=(StackNode *)malloc(sizeof(StackNode));
	top->next=NULL;
	return (top);
}
void push(StackNode *top,ElemType e)
{
	StackNode *p;
	p=(StackNode*)malloc(sizeof(StackNode));
	p->data=e;p->next=top->next;
	top->next=p;
}
ElemType pop(StackNode*top)
{
	if(top->next==NULL) 
	{cout<<"为空时,不能弹出"<<endl;return -1;}
	
		//ElemType e=top->data ;          //不能这样,因为top是为空栈的
	StackNode *p=top->next;
	ElemType e=p->data ;
	top->next=p->next;
	free(p);
		return e;
	
}
ElemType getTop(StackNode *top)
{
	return top->next->data;
}
void judge(char a[])    // 给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
{
	int len=strlen(a);  //遇到的第一个\0
	int i;
	StackNode *stack=Init_Link_Stack();
	for( i=0;i<len;i++)
	{
		if(a[i]=='('||a[i]=='['||a[i]=='{')
		{
			push(stack,a[i]);
		}
		if(a[i]!=')'&&a[i]!=']'&&a[i]!='}')  //输入的不是括号
		   continue;
		if(stack->next==NULL)//有了右半个括号,但是没有左半个括号的情况,因为不能获取最上的数据了,
		{
			cout<<"no"<<endl;break;
		}
		if(a[i]-getTop(stack)==1||a[i]-getTop(stack)==2)  //a[i]为3种情况,只要与最上匹配都行的。小括号相差1,大括号与中括号相差2
		{
			pop(stack);
		}
		else 
		{
			cout<<"no"<<endl;
			break;
		}
	}
	if(i==len)
	{
	if(stack->next==NULL)
	{
		cout<<"yes"<<endl;
	}
	}
}
int main()
{
	
	char *a1="a+(b*c+{(d-3)]})";
	char a[7]={'a','+','(','b','*','c',')'};
	judge(a1);
	
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值