c语言之栈的链式存储(带头结点,括号匹配)

#include 
#include 
typedef char ElemType;
typedef struct linknode {
	ElemType data;		//数据域
	struct linknode* next;//指针域
}LinkStNode;//链栈结点类型

//================初始化栈
void InitStack(LinkStNode*& s) {
	s = (LinkStNode*)malloc(sizeof(LinkStNode)); //创建链栈的头结点
	s->next = NULL;//将next域置为null
}

//================销毁栈(每个结点都要释放空间)
void DestroyStack(LinkStNode*& s) {
	LinkStNode* pre = s, * p = s->next; //pre指向头结点,p指向首结点
	while (p != NULL) { //循环到p为空
		free(pre);	//释放pre结点
		pre = p;	//pre、p同步后移
		p = pre->next;
	}
	free(pre);//此时pre指向尾结点,释放其空间
}

//判断栈是否为空
bool StackEmpty(LinkStNode* s)
{
	return(s->next == NULL);
}

//==================进栈
bool Push(LinkStNode*& s, ElemType e) {
	LinkStNode* p;
	p = (LinkStNode*)malloc(sizeof(LinkStNode)); //新建结点p
	p->data = e; //存放元素e
	p->next = s->next;//将p结点插入作为首结点
	s->next = p;
	return true;
}

//==================出栈
bool Pop(LinkStNode*& s, ElemType& e) {
	LinkStNode* p;
	if (s->next == NULL)	//栈空的情况
		return false;//返回假
	p = s->next;//p指向首结点
	e = p->data;//提取首结点值
	s->next = p->next; //删除首结点
	free(p); //释放被删除结点的存储空间
	return true; //返回真
}

//==================取栈顶元素
bool GetTop(LinkStNode* s, ElemType& e) {
	if (s->next == NULL)//栈空的情况
		return false; //返回假
	e = s->next->data; //提取首结点值
	return true;
}

//===============括号匹配(只有左括号和右括号)
//设置一个链栈st,遍历表达式exp,遇到左括号时进栈,遇到右括号时,若栈顶为左括号,则出栈,否则返回假;当表达式遍历完毕1而且
//栈为空时返回镇,否则返回假。
bool Match(char exp[], int n) {
	int i = 0;
	char e;
	bool match = true;
	LinkStNode* st;
	InitStack(st); //初始化链栈
	while(i < n && match) {//遍历exp中的所有字符
		if (exp[i] == '(')	//当前字符为左括号,将其进栈
			Push(st, exp[i]);
		else if (exp[i] == ')') //当前字符为右括号
		{
			if (GetTop(st, e) == true)//成功取栈顶元素e
			{
				if (e != '(')//栈顶元素不为‘(’时
					match = false;//表示不匹配
				else
					Pop(st, e); //将栈顶元素出栈
			}
			else match = false; //无法取栈顶元素时表示不匹配
		}
		i++; //继续处理其他字符
	}
	if (!StackEmpty(st)) //栈不空时表示不匹配
		match = false;
	DestroyStack(st); //销毁栈
	return match;

}

int main() {
	char exp[6] = "(())";
	bool result=Match(exp,6);
	printf("%d", result);
	return 0;
}

你可能感兴趣的:(c语言,数据结构,算法)