括号匹配问题,用栈实现

用栈实现括号匹配其实是一个很简单的问题,思路在代码注释里面写的很清楚了,只是接口设置的好像不太好。

如果在main里面设置的str不是动态分布的,在linux下就会出错,不知道windows会不会出问题。

kuohao.cpp

#include <iostream>
#include "stack.cpp"
using namespace std;
//仅用于检测(),{},[],其他的符号原理都是一样的
bool isCase(const char c1,const char c2)//用于判断两个符号是否是匹配的
{
	char ch1=c1;
	char ch2=c2;
	if(ch1==‘(‘&&ch2==‘)‘)//for ()
		return true;
	if(ch1==‘[‘&&ch2==‘]‘)//for []
		return true;
	if(ch1==‘{‘&&ch2==‘}‘)//for {}
		return true;
	return false;//其他的都返回false

};
bool rightCase(const char c)//判断是否是右边的符号
{
	char ch=c;
	if(c==‘)‘||c==‘]‘||c==‘}‘)
		return true;
	return false;

};
bool  match(char *m)//m为待测字符串
{
	mStack<char> ma;
	char ch;
	char *p=m;
	char top;//=*p;//栈顶符号,top总是指向最急需匹配的项,即栈顶元素,先随便指定一个top,但不能是左边的符号
			//top并不就是栈顶,而是栈顶的一个副本
	while(*p!=‘\0‘)//字符串未结束
	{

		ch=*p;//获取p里面的元素
		if(rightCase(ch))//检测是否是右边元素,是则与top进行匹配检测,否则入栈,top换成ch
		{
			if(ma.isEmpty())//如果栈为空,并且此时是右元素
				return false;
			if(isCase(top,ch))//否则进行匹配检查,若匹配,则top换成此时栈顶元素,
			{
				char temp;
				ma.Pop(temp);//temp其实就是之前的栈顶元素
				if(!ma.isEmpty())//如果取出一个元素之后,栈非空
				{
					ma.Pop(top);//令top复制现在的栈顶元素,因为此时栈顶被删除了,所以又要放回去
					ma.Push(top);//这样,top又和栈顶元素值一样了
				}//否则什么也不做,此时的top将会由下一个入栈的值重置

			}
			else	//倘若不匹配,则表明该序列不是匹配,因为最需匹配的项都无法匹配,不可能是匹配的
			 	return false;
		}
		else	//不是右边符号,则入栈,并变更top
		{
			top=ch;//换top//如果上一次出栈操作导致栈空了,top将在这里被重置
			ma.Push(ch);//ch入栈
		}
		p++;

	}
	if(ma.isEmpty())
		return true;
	return false;
};

main.cpp

#include "kuohao.cpp"
int main()
{
	//char *c[100];

	int i=5;
	while(i--)
	{
		char *str=new char[100];
		cout<<"please input the char **:";
		cin.getline(str,100);
		//cin.getline(c,100);
		cout<<str<<endl;
		//cout<<c<<endl;

		if(match(str))
			cout<<"this is match!"<<endl;
		else
			cout<<"doen‘t match!"<<endl;
//		match(c);
		//cin.get();
		delete str;
	}

	return 0;
}

stack.cpp

//用于实现栈的操作
#include <iostream>
using namespace std;
//const int MAX=100;//栈最大长度值为100,用数组实现栈
//写成模板类是为了方便我以后使用
template <class T>
class mStack{
	private:
		enum {MAX=100};
		T arr[MAX];
		int Size;
		int top;//用于指示栈顶位置
	public:
		mStack(	)//构建空栈
		{
		  top=-1;//下标为-1则为空栈
		  Size=0;
		}
		bool isEmpty()
		{
			return top==-1;
		}
		bool isFull()
		{
			return top==MAX-1;
		}
		bool Push(T &item)
		{
			if(isFull())
			{
				cout<<"stack is full!"<<endl;
				return false;
			}
			//++top;
			//arr[++top]=item;
			arr[++top]=item;//因为下标从-1开始,使用前+1
			//cout<<"this "<<top<<" item push values is :"<<arr[top]<<endl;
			Size++;
			return true;
		}
		bool Pop(T &item)
		{
			if(isEmpty())
			{
				cout<<"stack is empty!"<<endl;
				return false;
			}
			item=arr[top--];//因为下标从-1开始,top指向当前最后一个元素,使用后-1
			//cout<<"this "<<top<<" item pop values is :"<<arr[top]<<endl;
			Size--;
			return true;
		}
		int size()
		{
			return Size;
		}

};

括号匹配问题,用栈实现

时间: 2024-10-13 22:01:47

括号匹配问题,用栈实现的相关文章

括号匹配为题(栈的思想)哈

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

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

题目1153:括号匹配问题(栈的应用)

题目1153:括号匹配问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6726 解决:2926 题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配.写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号.不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注. 输入: 输入包括多组数据,每组数据一行,包含一

括号匹配(链栈实现)

/* 建立链栈实现括号匹配问题 创建栈,判断是否空栈 */ #include<stdio.h> #include<stdlib.h> #include<string.h> #define status int typedef struct node { char ch; node* next; }SNode; typedef struct { SNode *top; //SNode *base; }Stack; //创建空栈 base 赋值为NULL, top 指向栈顶

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

括号配对问题: 假设一个表达式中包含三种类型的括号:(),{ },[],嵌套顺序任意 { [()()] } 1  2 3 4  5  6 7  8 引入"期待的急迫程度"概念,例如当接受第一个括号 { ,则它期待与第8个 } 匹配,然而当接受到第二个 [ 时,此时[最期待和第七个 ] 匹配. #ifndef _MATCH_H_ #define _MATCH_H_ #include<iostream> #include <malloc.h> #include &l

猿辅导:字符压缩算法(括号匹配)

题目描述 猿辅导APP需要下发一些宣传文本给学生,工程师们使用了一种字符压缩算法,为了简单起见,假设被压缩的字符全部为大写字母序列,A,B,C,D,E……Z,压缩规则如下: 1. AAAB 可以压缩为 A3B(单字符压缩不加括号) 2. ABABA 可以压缩为 (AB)2A (多字符串压缩才加括号) 输入数据保证不会出现冗余括号,且表示重复的数字一定合法且大于1,即不会出现: (A)2B ---------(应为:A2B) ((AB))2C ---------(应为:(AB)2C) (A)B -

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 1 public class StackChar 2 { 3 private int maxSize;//堆栈数组大小 4 private char [] stackArray; 5 private int top;//堆栈顶 6 public StackChar(int maxSize) 7 { 8 thi

数据结构上机3栈-括号匹配

#include <stdio.h> #include <malloc.h> #define OK 1 #define OVERFLOW -1 #define ERROR 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef char SElemType; typedef int Status; typedef struct{ SElemType * base; SElemType * top; int st

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

数据结构复习_栈和队列,应用_括号匹配&amp;文件目录递归拷贝,

1.主题 2.学习视频和资料 视频    http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=701019&courseId=555010 http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=702024&courseId=555010 3.实现 数组或列表实现 4.应