2018-08-05 10:31:26 qq_42817826 阅读数 193
  • JavaWeb实战开发

    本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发

    3550 人正在学习 去看看 颜群

K 括号括号
时间限制 内存限制 出题人
1Second 512Mb 刘帅坤
题目描述
小明今年上大学,在大学里发现有很多同学都女朋友,两人整天都在一起腻歪,小明看到后感
觉很孤单,现在,给你一行括号序列,你来判断一下其中的括号是否配对。
输入
第一行输入一个数 N (0< N< 100)表示有N组测试数据。后面的N行输入多组输入数据,每组
输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保
证S中只含有”[“,”]”,”(“,”)” 四种字符 ,输入以“EOF”结束。
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则
输出No。
输入样例
3
[(])
(])
([])
输出样例
No
No
Yes
注意:此题的测试数据组是多组的。

括号匹配AC代码(c语言数据结构写法)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 10000
#define STACKINCREMENT 10
typedef struct{
    char *top;
    char *base;
    int stacksize;
}SqStack;
int initstack(SqStack &S)
{
    S.base=(char*)malloc(STACK_INIT_SIZE * sizeof(char));
    if(!S.base)
    return 0;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return 1;

}
int pop(SqStack &S)
{
    char e;
    if(S.top==S.base)
    return 0;
    e=*--S.top;
    return 1;
}
int stackempty(SqStack &S)
{
    if(S.top==S.base)
    return 1;
    if(S.top!=S.base)
    return 0;
}
int push(SqStack &S,char e)
{

    if(S.top-S.base>=S.stacksize)
    {
        S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT* sizeof(char)));
        S.base=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;

    }
    *S.top++=e;
    return 1;
}
int gettop(SqStack &S)
{
    char e;
    if(S.top==S.base)
    return 0;
     e=*(S.top-1);
     return  e;
}

int main()
{
    SqStack S;
    char ch[10000],*p;
    int answer;
    int n;
    while(scanf("%d",&n)!=EOF)
    {

    getchar();
    while(n--)
    {

   scanf("%s",ch);
    {
        initstack(S);
        answer=0;
        p=ch;
    while(*p!='\0')
        {
            if(*p=='[')
            push(S,*p);
            else if(*p=='(')
            push(S,*p);
            else if(*p==']')
            {

                if(gettop(S)=='[')
                pop(S);
                else
                {
                answer=1;
                 break;
                }
             } 
             else if(*p==')')
             {
                if(gettop(S)=='(')
                {
                    pop(S);
                 }
                else
                 {
                  answer=1;
                  break;
                 }
             }
             else
             {
                answer=1;
                break;
             }

             p++;

        }
     if(answer==0&&stackempty(S))
    printf("Yes\n");
    else
    printf("No\n");
    }

}
}
    return 0;
}

括号匹配AC代码(c++stl中的stack写法)

#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
const int N=10000+1;
using namespace std;
stack<char>sk;
char str[N];
int main()
{
    int T,answer;
    while(~scanf("%d",&T))
    {

        getchar();
        while(T--)
        {
            answer=0;
            while(!sk.empty()) 
            sk.pop();
            memset(str,0,sizeof(str));
            gets(str);
            int len=strlen(str);
            for(int i=0;i<len;i++)
            {
                if(str[i]=='['||str[i]=='(')
                sk.push(str[i]);
                else if(str[i]==']')
                {
                    if(sk.top()=='[')
                    sk.pop();
                    else
                    {
                        answer=1;
                        break;
                    }
                }
                else if(str[i]==')')
                {
                    if(sk.top()=='(')
                    sk.pop();
                    else
                    {
                        answer=1;
                        break;
                    }
                }
            }
            cout<<sk.size()<<endl;
        if(answer==0&&sk.empty())
            printf("Yes\n");
            else
            printf("No\n");
        }
    }
    return 0;
}

思路:只要是左括号都入栈,当遇到右括号就判断它的栈顶元素是否为对应的左括号,如果是把栈顶元素出栈,不是则把answer置为1,只要有一个不匹配则无需再进行下去。
判断是否完全匹配,则看是否answer=0,因为一旦有不匹配的,则answer会=1,并且栈必须为空,为什么呢?比如((),此时遇到右括号他们是匹配的,但是多出一个左括号,如果不加上栈为空的条件则会判断这种情况是正确的,但其实是错误的。
光有一个栈是否为空行不行?不行,比如())的情况,遇到右括号出栈,此时栈为空,但并不完全匹配。
所以必须两个条件都满足。
这仅是一个思路,其它的写法也可以。

2016-10-07 17:55:22 ricefrant 阅读数 4376
  • JavaWeb实战开发

    本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发

    3550 人正在学习 去看看 颜群

同样是用栈模板写的,实现上比慕课网上讲的简单一些,没有定义两个栈,而是直接判断是否是左括号,是的话就在MyStack中push另一半括号;如果是右括号且又不是需要的括号,就直接打印不匹配,如果是需要的右括号,就pop掉左括号。最后看mystack中栈顶是否为0,为0则打印括号匹配。


代码如下,写的不好还请大家指出共同讨论

demo.cpp

#include <iostream>
#include "MyStack.h"
using namespace std;

int main(void)
{
	MyStack<char> *pStack = new MyStack<char>(30);
	char *ch, x;
	int i,flag=1;
	ch = new char[30];
	cin >> ch;
	char elem;
	int length = strlen(ch);
	for (i = 0; i < length; i++)
	{
		if (ch[i] == '(' || ch[i] == '[')
		{
			pStack->push(ch[i]);
		}
		else if (ch[i] == ')')
		{
			 pStack->pop(ch[i]);
			if (ch[i] != '(')
			{
				cout << "括号不匹配" << endl;
				flag = 0;
			}
		}
		else if (ch[i] == ']')
		{
			elem = pStack->pop(ch[i]);
			if (ch[i] != '[')
			{
				cout << "括号不匹配" << endl;
				flag = 0;
			}
		}
	}
	if (pStack->stackLength() != 0)
	{
		cout << "括号数量不匹配" << endl;
		flag = 0;
	}
	if (flag == 1)
		cout << "括号匹配" << endl;
	
}

MyStack.h

#pragma once
#include "MyStack.h"
#include <iostream>
using namespace std;

template <typename T>
class MyStack
{
public:
	MyStack(int size);  //分配内存初始化栈空间,设定栈容量,栈顶
	~MyStack();         //回收栈空间内存
	bool stackEmpty();  //判断栈是否为空,为空返回true,非空返回false
	bool stackFull();   //判断栈是否已满,已满返回true,不满返回false
	void clearStack();  //清空栈
	int stackLength();  //已有元素的个数
	bool push(T elem);//元素入栈,栈顶上升
	bool pop(T &elem);//元素出栈,栈顶下降
	void stackTravers(); //遍历栈中所有元素

private:
	T *m_stack;     //栈空间指针
	int m_iSize;       //栈容量
	int m_iTop;        //栈顶,栈中元素数量  
};




template <typename T>//每一个函数前面都要加


MyStack<T>::MyStack(int size)
{
	m_iSize = size;
	m_stack = new T[size];
	m_iTop = 0;//当前的栈是一个空栈,空栈,栈顶为零
}
template <typename T>
MyStack<T>::~MyStack()
{
	delete[]m_stack;//释放数组的内存
}
template <typename T>
bool MyStack<T>::stackEmpty()
{
	if (0 == m_iTop)//更加高质量
	{
		return true;
	}
	return false;
}
template <typename T>
bool MyStack<T>::stackFull()
{
	if (m_iTop == m_iSize)//写成>=一样
	{
		return true;
	}
	return false;
}
template <typename T>
void MyStack<T>::clearStack()
{
	m_iTop = 0;//令栈顶复原,就算原来的栈里有值,下一次赋值也会进行覆盖

}
template <typename T>
int MyStack<T>::stackLength()
{
	return m_iTop;
}
template <typename T>
bool MyStack<T>::push(T elem)//一定要放在栈顶
{
	if (stackFull())
	{
		//可以用throw来抛出异常
		return false;
	}
	m_stack[m_iTop] = elem;
	m_iTop++;//此时栈顶指向的是一个空位置
	return true;

}
template <typename T>
bool MyStack<T>::pop(T &elem)//传入的是一个引用
{
	if (stackEmpty())
	{
		return false;
	}
	m_iTop--;//将栈顶降低至实际的栈顶
	elem = m_stack[m_iTop];
	return true;
}


//void MyStack::stackTravers(visit())复杂的栈需要一个函数做指针来遍历
template <typename T>
void MyStack<T>::stackTravers()
{

	for (int i = 0; i < m_iTop; i++)
	{
		//m_stack[i].Coorprint();
		cout << m_stack[i];
	}
}


2019-11-10 15:01:28 weixin_43943281 阅读数 28
  • JavaWeb实战开发

    本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发

    3550 人正在学习 去看看 颜群

c语言实现括号匹配检测

#include<stdio.h>
#include<iostream>
#include<string>
typedef struct bracketStack {
	char data;
	bracketStack* next;
	int quenesize;
	//初始化函数
	void InitQuene(bracketStack*& Q);
	//弹出
	bool pop(bracketStack*& Q, char& e);
	//压入
	bool push(bracketStack*& Q, char e);
}*Bracket;

void bracketStack::InitQuene(bracketStack*& Q) {
	Q = NULL;
}
bool bracketStack::pop(bracketStack*& Q, char& e) {
	if (!Q)return false;
	Bracket p = Q;
	e = Q->data;
	Q = Q->next;
	free(p);
	return true;
}
bool bracketStack::push(bracketStack*& Q, char e) {
	Bracket q = (Bracket)malloc(sizeof(bracketStack));
	if (!q)return false;
	q->data = e;
	q->next = Q;
	Q = q;
	return true;
}

static std::string getBracket() {
	std::string AllBracket;
	std::cout << "请输入所要检查的括号表达式" << std::endl;
	bool psw = false;
		do {
			std::cin >> AllBracket;
			psw = false;
			for (auto i : AllBracket) {
				if ((int)i==40||(int)i==41||(int)i==91||(int)i==93) continue; 
				std::cout << "请重新输入括号表达式!!!" << std::endl;
				psw = true;
				break;
			}
		} while (psw);
		return AllBracket;
}
static bool Juage(std::string allbracket,Bracket Bstack) {

	//主方法
	char alone;
	for (auto i : allbracket) {
		if (i == '(' || i == '[')Bstack->push(Bstack, i);
		else if (i == ')') {
			if (!Bstack->pop(Bstack, alone))return false;
			if (alone == '(')continue;
			else { return false; }
		}
		else if (i == ']') {
			if (!Bstack->pop(Bstack, alone))return false;
			if (alone == '[')continue;
			else { return false; }
		}
	}
	if (Bstack == NULL)return true;
	else
	{	return false;}
}
int main(){
	//初始化一个栈
	Bracket Bstack;
	Bstack->InitQuene(Bstack);
	//从用户接受数据
	std::string  allbracket = getBracket();
	
	if (Juage(allbracket, Bstack))
		std::cout << "匹配" << std::endl;
	else	{ std::cout << "此串括号匹配不合法" << std::endl; }
	
	return 0;

}
2019-11-03 11:05:40 liuzhaoze2000 阅读数 19
  • JavaWeb实战开发

    本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发

    3550 人正在学习 去看看 颜群

实现小括号和中括号的匹配检测,并且标记未匹配的括号。
算法思想:利用堆栈储存左括号,当遇到右括号时,检测栈顶括号是否与该右括号的类型相同。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 128

//声明堆栈元素:储存左括号的类型和位置
struct brackets
{
    char ch;
    int position;
};

struct brackets stack[MAX]; //定义栈
int top = 0;                //定义栈顶且初始化
int IsPaired;               //定义配对标志位

void push(char bracket, int pos)
{
    if (top == MAX)
    {
        printf("Stack overflow.\n");
        exit(-2);//上溢
    }
    stack[top].ch = bracket;
    stack[top].position = pos;
    top++;
}

struct brackets pop(void)
{
    if (top == 0)
    {
        printf("Stack underflow.\n");
        exit(-3);//下溢
    }
    return stack[--top];
}

char *MarkInit(int size)//标记字符串初始化函数
{
    char *mark, *p;
    mark = (char *)malloc(sizeof(char) * size);

    for (p = mark; (p - mark) < (size - 1); p++)
        *p = ' ';
    *p = '\0';

    return mark;
}

int DetectMark(char *mark)//检测标记函数
{
    for (; *mark != '\0'; mark++)
    {
        if (*mark == '^')
            return 1;
    }
    return 0;
}

int main(void)
{
    char str[MAX];
    char *mark, *p;
    struct brackets cmp;//用于储存出栈的元素
    
    printf("Enter:\n");
    scanf("%[^\n]", str);
    mark = MarkInit(strlen(str) + 1);//定义标记字符串

    for (p = str; *p != '\0'; p++)
    {
        if (*p == '[' || *p == '(')
            push(*p, p - str);

        if (*p == ')')
        {
            IsPaired = 0;
            while (top > 0)//右圆括号只弹出一个
            {
                cmp = pop();
                if (cmp.ch != '(')
                {
                    push(cmp.ch, cmp.position);//将未匹配的括号(中括号)压回栈中
                    mark[p - str] = '^';//标记此处右括号无配对
                    break;
                }
                else
                {
                    IsPaired = 1;
                    break;
                }
            }
            if (top == 0 && IsPaired == 0)//未找到左圆括号与之匹配
            {
                mark[p - str] = '^';//标记右圆括号
            }
        }

        if (*p == ']')
        {
            IsPaired = 0;
            while(top > 0)
            {
                cmp = pop();
                if (cmp.ch != '[')
                {
                    mark[cmp.position] = '^';//标记中括号内未匹配的圆括号
                }
                else
                {
                    IsPaired = 1;
                    break;
                }
            }
            if (top == 0 && IsPaired == 0)//未找到左中括号与之匹配
            {
                mark[p - str] = '^';//标记右中括号
            }
        }
    }

    while (top != 0)//标记栈中所有未配对的括号
            mark[pop().position] = '^';

    if (DetectMark(mark))
        printf("%s\nNot paired.\n", mark);
    else
        printf("Paired.\n");

    system("pause");
    return 0;
}
2016-03-18 12:42:36 YuYunTan 阅读数 1411
  • JavaWeb实战开发

    本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发

    3550 人正在学习 去看看 颜群

导言

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即【{}】或【([][])】等为正确的格式【[(])】或【[())】等均为不正确的格式。

括号匹配

思路:

左括号入栈,在未遇到右括号前,一直入栈,一旦遇到匹配的右括号,就一直弹出栈顶元素,直到栈空,若栈空,左括号与右括号已匹配完全,则完全匹配,反之则反。

实现

/* 函数结果状态代码 */
#define     TRUE                1
#define     FALSE               0
#define     OK                  1
#define     ERROR               0
#define   OVERFLOW             -2
typedef char SElemType; // 定义栈元素类型为整型
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
//相关头文件包含
#include <iostream>
using namespace std;

/*栈的顺序存储表示 */
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
typedef struct SqStack
{
    SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
    SElemType *top; /* 栈顶指针 */
    int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
/* --------    顺序栈基本函数实现    -------------------*/
Status InitStack(SqStack *S)
{ /* 构造一个空栈S */
    (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if (!(*S).base)
        exit(OVERFLOW); /* 存储分配失败 */
    (*S).top = (*S).base;
    (*S).stacksize = STACK_INIT_SIZE;
    return OK;
}
Status DestroyStack(SqStack *S)
{ /* 销毁栈S,S不再存在 */
    free((*S).base);
    (*S).base = NULL;
    (*S).top = NULL;
    (*S).stacksize = 0;
    return OK;
}

Status ClearStack(SqStack *S)
{ /* 把S置为空栈 */
    (*S).top = (*S).base;
    return OK;
}

Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
    if (S.top == S.base)
        return TRUE;
    else
        return FALSE;
}

int StackLength(SqStack S)
{ /* 返回S的元素个数,即栈的长度 */
    return S.top - S.base;
}


Status GetTop(SqStack S, SElemType &e)
{
    if (S.top == S.base)return ERROR;
    e = *(S.top - 1);
    return OK;
}//GetTop

Status Push(SqStack &S, SElemType e)
{
    //插入元素e为新的栈顶元素
    if (S.top - S.base >= S.stacksize)
    {//栈满,追加存储空间
        S.base = (SElemType *)realloc(S.base, (S.stacksize, STACKINCREMENT)*sizeof(SElemType));
        if (!S.base)exit(OVERFLOW);
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return OK;
}//push

Status Pop(SqStack &S, SElemType &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
    if (S.top == S.base)return ERROR;
    e = *--S.top;
    return OK;
}//pop

Status StackTraverse(SqStack S, Status(*visit)(SElemType))
{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */
    /* 一旦visit()失败,则操作失败 */
    while (S.top>S.base)
        visit(*S.base++);
    cout << "\n";
    return OK;
}

void visit(SElemType e)
{
    cout << e;
}

void check()
{// 对于输入的任意一个字符串,检验括号是否配对
    SqStack sq;
    SElemType ch[100], *p, e;
    InitStack(&sq); // 初始化栈成功
    cout << "请输入带括号(()、[]和{})的表达式:\n";
    cin.getline(ch, 101, '\n');
    p = ch;//p指向第一个
    while (*p != '\0')//没到表尾
    {
        switch (*p)
        {
        case '(':
        case '[':
        case '{':
            Push(sq, *p++); // 左括号入栈,且p++,p指向下一个元素
            break;
        case ')':
        case ']':
        case '}':
            if (!StackEmpty(sq))//如果栈不为空
            {
                Pop(sq, e); // 弹出栈顶元素
                if (!(e == '('&&*p == ')' || e == '['&&*p == ']' || e == '{ '&&*p == ' }'))
                { // 出现3种匹配情况之外的情况
                    cout << "左右括号不匹配" << endl;
                    system("pause");
                    exit(ERROR);
                }
            }else // 栈空
            {
                    cout << "缺乏匹配的左括号" << endl;
                    system("pause");
                    exit(ERROR);
            }
        default:
            p++;//只把括号字符压栈,其他字符不压栈
            break;
        }
    }
    if (StackEmpty(sq)) // 字符串结束时栈空
        cout << "括号完全匹配" << endl;
    else
        cout << "缺乏右括号" << endl;

}

int main()
{
    //本程序说明,是在VS2013中运行的,若是其他地方无法运行,建议修改代码
    //程序声明
    cout << "***************************************************************************" << endl;
    cout << "                   《数据结构》<C语言版本>严蔚敏 吴伟名 编著              " << endl;
    cout << "                                编写年月2016年3月                         " << endl;
    cout << "                                 编写者:YuYunTan                          " << endl;
    cout << "                                      括号匹配                             " << endl;
    cout << "***************************************************************************" << endl;
    check();
    system("pause");
    return 0;
}

运行结果

这里写图片描述
这里写图片描述

括号匹配

阅读数 283

没有更多推荐了,返回首页