栈的应用之括号匹配

思路:

在算法中设置一个栈,每读入一个空号

一:若是右括号: ‘}‘  ‘ )‘   ‘]‘(两种情况):

1:使置于栈顶的最急迫的期待得以消解,需将栈顶元素出栈;

2:不合法的情况,即与栈顶的最急迫的期待不匹配,需将其(括号)压栈;

二:若是左括号:‘(‘  ‘{‘  ‘[‘

作为一个新的更急迫的期待压栈;

顺序栈的代码不再赘述:点击打开链接

							//括号匹配
#include"stack.h"
int main()
{
	Stack st;
	InitStack(&st);
	int flag = 1;

	while(flag)
	{
		/*要测试的一串括号*/
		char str[100] ;
		cout<<"请输入一串括号:"<<endl;
		scanf("%s",str);

		char *p = str;//指向字符串数组
		char e;

		while(*p != '\0')
		{

			if(*p == '[' || *p == '{' || *p == '(')
			{
				Push(&st,*p);
				p++;
			}
			else
			{
				if(*p == ']')
				{
					if(st.base[st.top - 1] == '[')
						Pop(&st,&e);
					else
						Push(&st,*p);
				}
				if(*p == ')')
				{
					if(st.base[st.top - 1] == '(')
						Pop(&st,&e);
					else
						Push(&st,*p);
				}
				if(*p == '}')
				{
					if(st.base[st.top - 1] == '{')
						Pop(&st,&e);
					else
						Push(&st,*p);
				}
				p++;
			}
		}
		if(st.top == 0)
			cout<<"括号匹配"<<endl;
		else
			cout<<"括号不匹配"<<endl;

		cout<<"continue:1  break:0"<<endl;
		cin>>flag;

	}
	destory(&st);
	return 0;
}

改进后代码:

							//括号匹配
#include"stack.h"
int main()
{
	Stack st;
	InitStack(&st);
	int flag = 1;

	while(flag)
	{

		char str[100];
		cout<<"请输入一串括号:"<<endl;
		scanf("%s",str); //用cin为何是错误的????

		char *p = str;
		char e;

		while(*p != '\0')
		{

			if(*p == '[' || *p == '{' || *p == '(')
			{
				Push(&st,*p);
				p++;
			}
			else
			{
				if( (*p == ']' && st.base[st.top - 1] == '[')
					||(*p == '}' && st.base[st.top - 1] == '{')
					  ||(*p == ')' && st.base[st.top - 1] == '(')
					  )
					  Pop(&st,&e);
				else
					Push(&st,*p);
					p++;
			}
		}
		if(st.top == 0)
				cout<<"括号匹配"<<endl;
		else
				cout<<"括号不匹配"<<endl;
		cout<<"continue:1  break:0"<<endl;
		cin>>flag;
	}
	destory(&st);
	return 0;
}
时间: 2024-08-10 15:09:03

栈的应用之括号匹配的相关文章

栈应用——最长括号匹配

问题描述: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长的括号字串,并返回字串的长度. 如: ((): 2 ()(): 4 ()(()):6 (()()): 6 思路分析: 记起始位置start = -1,最大匹配长度为max 考虑当前位置i的符号: 如果是'(',直接入栈: 如果是')': 如果栈空,则起始位置更新为i; 如果栈不空,则肯定能与栈顶的左括号匹配,然后考虑弹出一个左括号后的栈: 若栈空,则说明此次是一个匹配,匹配长度为:i-start,然

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 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

栈的应用之括号匹配的检验

栈的实际应用很多,其中括号匹配是很常见的例子.下面列出基本算法和源代码,标明注释以便日后复习和翻阅. Description: 利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的 顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式.输入一个包含上 述括号的表达式,检验括号是否配对.本题给出部分check()函数,要求将check()函数补充完整,并完成 整个程序. 算法: 代码: 1 void c

顺序栈(进制转换 + 括号匹配 + 判断栈表 + 最长括号匹配长度)

#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKLINCREMENT 10

数据结构(C语言) 栈的应用之括号匹配

#include<stdio.h> #include<stdlib.h> typedef struct SqStack { char str[100]; int top; }SqStack; void Push(SqStack* S, char c) { S->top++; S->str[S->top] = c; } void Pop(SqStack* S, char* c) { *c = S->str[S->top]; S->top--; }

数据结构-栈的实现之括号匹配检测

假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先检测栈是否为空, 若栈空则表明此右括弧多余,表达式不匹配. 否则和栈顶数据比较,若匹配则栈顶出栈. 否则表明表达式不匹配: 最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配. 实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作

Java中栈的应用,括号匹配

1 package edu.yuliang.Data_Structure_Basics; 2 3 import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; 4 /* 5 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 6 7 有效字符串需满足: 8 9 左括号必须用相同类型的右括号闭合. 10 左括号必须以正确的顺序闭合. 11 注意空字符串可被认为是有效字符串. 12 13 14 实现思路: 15

栈:WHT解决括号匹配问题

#include<iostream>using namespace std;#define stacksize 100;struct stack{ char strstack[stacksize]; int top; };void InitStack(stack &s){ s.top=-1;}char push(stack &s,char a){ if(s.top==stacksize-1) return 0; s.top++; s.strstack[s.top]=a; ret

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

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