【数据结构】栈的应用 括号匹配

括号配对问题:

假设一个表达式中包含三种类型的括号:(),{ },【】,嵌套顺序任意

{ 【()()】 }

1  2 3 4  5  6 7  8

引入“期待的急迫程度”概念,例如当接受第一个括号 { ,则它期待与第8个 } 匹配,然而当接受到第二个 【 时,此时【最期待和第七个 】 匹配。

#ifndef _MATCH_H_
#define _MATCH_H_

#include<iostream>
#include <malloc.h>
#include <string.h>
#include<assert.h>//断言

using namespace std;

#define MAXLEN 100
typedef char ElemType;

typedef struct node
{
	ElemType data;
	struct node *next;
}Node, *LinkStack;

void InitStack(LinkStack *stack);//将链栈初始化
bool StackEmpty(LinkStack stack);//判断链栈是否为空
ElemType* GetTop(LinkStack stack, ElemType *e);//取栈顶元素
bool PushStack(LinkStack stack, ElemType e);//进栈操作
bool PopStack(LinkStack stack, ElemType *e);//出栈操作
int StackLength(LinkStack stack);//求表长操作
void DestroyStack(LinkStack stack);//销毁链表
bool Match(ElemType e, ElemType ch);//判断括号 

#endif
#include "match.h"

void InitStack(LinkStack *stack)//将链栈初始化
{
	if ((*stack = (LinkStack)malloc(sizeof(stack))) == NULL)
	{
		exit(-1);
	}
	(*stack)->next = NULL;
}

bool StackEmpty(LinkStack stack)//判断链栈是否为空
{
	if (NULL == stack->next)
		return true;
	else
		return false;
}

ElemType* GetTop(LinkStack stack, ElemType *e)//取栈顶元素
{
	Node *p = stack->next;

	if (!p)
	{
		return NULL;
	}

	*e = p->data;
	return e;
}

bool PushStack(LinkStack stack, ElemType e)//进栈操作
{
	Node*s = (Node *)malloc(sizeof(Node));
	if (NULL == s)
		return false;

	s->data = e;
	s->next = stack->next;
	stack->next = s;

	return true;
}

bool PopStack(LinkStack stack, ElemType *e)//出栈操作
{
	Node *p = stack->next;

	if (StackEmpty(stack))
	{
		cout << "EmptyStack"<<endl;
		return false;
	}

	stack->next = p->next;
	*e = p->data;
	free(p);
	p = NULL;

	return true;

}

void DestroyStack(LinkStack stack)//销毁链表
{
	Node *p = stack;
	Node *q  = NULL;

	while (!p)
	{
		q = p;
		p = p->next;
		free(q);
		q = NULL;
	}
}

bool Match(ElemType e, ElemType ch)//判断括号
{
	if ( ('(' == e)  &&  (')'== ch) )
		return true;
	else if ( ('{' == e) && ('}' == ch) )
		return true;
	else if ( ('[' == e) && (']' == ch) )
		return true;
	else
		return false;
}
#include "match.h"

int main(void)
{
	char *p;
	ElemType e;
	ElemType ch[MAXLEN];
	LinkStack s;

	InitStack(&s);

	cout << "Please input the expression with bracket('()','{}','[]')" << endl;

	gets_s(ch);
	p = ch;
	while (*p)
	{
		switch (*p)
		{
		case '(':
		case '[':
		case '{':
			PushStack(s,*p++);
			break;

		case ')':
		case ']':
		case '}':
			if ( StackEmpty(s) )
			{
				cout << "miss left bracket!" << endl;
				return 0;
			}

			else
			{
				GetTop(s, &e);		/*栈不为空 读取的是右括号 则取出栈顶括号*/
				if (Match(e, *p))    /*判断栈顶括号是否为右括号*/
				{
					PopStack(s, &e);/*若栈顶括号和右括号匹配,则栈顶括号出栈*/
				}

				else                /*不匹配*/
				{
					cout << "not match" << endl;
					return 0;
				}
			}

		default:
			p++;
		}
	}

	if (StackEmpty(s))
		cout << "bracket match!" << endl;
	else
		cout << "not match,miss right bracket" << endl;
	return 0;
}

时间: 2024-11-08 21:12:34

【数据结构】栈的应用 括号匹配的相关文章

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

数据结构 栈的应用——括号匹配的检验

1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 100 //存储空间初始分配量 7 #define STACKINCREMENT 10 //存储空间分配增量 8 #define SElemType char //当前数据类型 9 10 typedef struct 11 { 12 S

数据结构实验之栈四:括号匹配(栈)

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出"yes",不匹配输出"no" 示例输入 sin(20+10) {[}] 示例输出 yes no 提示 来源 ma6174

[栈和队列]括号匹配

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define INIT_STACK_SIZE 100 5 typedef struct 6 { 7 char * chOperator; 8 int dwtop; 9 }OPND; 10 11 void InitStack(OPND *); 12 char Pop(OPND *); 13 void Push(OPND *,char );

leetcode题解:Valid Parentheses(栈的应用-括号匹配)

题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]&

栈应用之括号匹配

栈的使用之括号匹配 Char s[n]是一个字符串数组.Stack是一栈,i是元素对应的下表.设一个char flag[n]数组,用来标记是否匹配,数组中数值是‘l’(左不匹配,即没有找到右括号),‘r’(右不匹配),‘o’匹配成功. 算法描述: (1)遍历该字符串数组. While(遍历){ if遇到‘(’,do stack.push(i)(i 是‘(’对应的数组下表),flag[i]=’o’(不一定就是匹配成功,以后遍历完如果stack还有元素,说明没有左匹配,要改成‘l’:如果没有,则就是

栈应用之 括号匹配问题(Python 版)

栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出当时的栈顶元素与之匹配 如果匹配成功则继续,发现匹配失败时则以检查失败结束 1 def check_parens(text) : 2 # 括号匹配检查函数,text 是被检查的正文串 3 parens = "(){}[]" 4 open_parens = "({[" 5

【数据结构】栈的应用——括号匹配问题

括号匹配问题: 给一个字符串,其中包含小括号.中括号.大括号,求该字符串中的括号是否匹配. 例如:()()[]{} 匹配([{()}]) 匹配[](               不匹配[(])              不匹配 利用堆栈的思路:建立一个堆栈,然后遍历字符串,如果是'(','{'.'[',则入栈,否则判断当前字符串和栈顶元素是否是一对括号:要注意的是,需要提前判断栈是否为空,为空的时候取top是违法的的,所以只要为空就入栈,然后执行下一次循环,而且,只要循环过程中出现一次栈顶元素和

jzyzoj 栈——P1148:括号匹配加强版

括号匹配加强版 描述 Description 对于一个由(,),[,]括号组成的字符串,求出其中最长的括号匹配字串. 具体来说,满足如下条件的字符串成为括号匹配的字符串: (1) (),[] 是括号匹配的字符串. (2) 若A是括号匹配的串,则(A)或[A] 是括号匹配的字符串. (3) 若A和B都是括号匹配的字符串,则A+B也是括号匹配的字符串.(这里的+是字符串的加法运算). 例如:(),[],([]),()() 都是括号匹配的字符串,而][,[( ]),(]则不是. 字符串A的子串是指由A