博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用栈实现字符串中三种括号的匹配问题c++语言实现
阅读量:5006 次
发布时间:2019-06-12

本文共 2667 字,大约阅读时间需要 8 分钟。

编写一个算法,检查一个程序中的花括号,方括号和圆括号是否配对,若能够全部配对则返回1,否则返回0

Head.h:

#ifndef HEAD_H_INCLUDED

#define HEAD_H_INCLUDED

#include<iostream>

struct LinkedNode

{

    int data;

    LinkedNode*next;

};

 

class LinkedStack//链式栈的类定义

{

public:

    LinkedStack();

    ~LinkedStack(){makeEmpty();};

    void Push(LinkedNode &);

    int Pop();

    bool getTop(LinkedNode&x)const;

    bool IsEmpty()const{return (top==NULL)?true:false;}

    int getSize()const;

    void makeEmpty();

    void print();

private:

    LinkedNode *top;

};

 

 

#endif // HEAD_H_INCLUDED

 

Methods.cpp:

#include"head.h"

#include<iostream>

using namespace std;

LinkedStack::LinkedStack(){top=NULL;}

void  LinkedStack::makeEmpty()

{

    LinkedNode*p;

    while(top!=NULL)

    {

        p=top;top=top->next;delete p;

    }

}

void LinkedStack::Push(LinkedNode &x)

{

    LinkedNode *p=top;

    x.next=p;

    top=&x;

}

int LinkedStack::Pop()

{int data=top->data;

    LinkedNode*p=top;

    top=top->next;

    delete p;

    return data;

}

bool LinkedStack::getTop(LinkedNode&x)const

{

    if(IsEmpty()==true)return false;

    x=*top;

    return true;

}

int LinkedStack::getSize()const

{

    int k=0;

    LinkedNode*p=top;

    while(p!=NULL){p=p->next;k++;}

    return k;

}

void LinkedStack::print()

{

    cout<<"栈中元素个数="<<getSize()<<endl;

    LinkedNode*p=top;int i=0;

    while(p!=NULL)

    {

        cout<<++i<<":"<<p->data<<endl;

        p=p->next;

    }

}

 

 

Main.cpp:

#include"head.h"

#include <iostream>

#include<string.h>

using namespace std;

//所要求的判断括号匹配的算法

void PrintMatchedPairs(char *expression)

{

    LinkedStack s1;LinkedStack s2;LinkedStack s3;

    int j,length=strlen(expression);

    cout<<"对于小括号()的情况:"<<endl;

    for(int i=1;i<=length;i++)

    {

        if(expression[i-1]=='('){LinkedNode t;t.data=i;s1.Push(t);}//左括号,位置进栈

        else if(expression[i-1]==')')

        {

            if(s1.IsEmpty()==false){j=s1.Pop();cout<<j<<""<<i<<"匹配"<<endl;}

            else cout<<"没有与第"<<i<<"个右括号匹配的左括号!"<<endl;

        }

    }

    while(s1.IsEmpty()==false)

    {

        j=s1.Pop();

        cout<<"没有与第"<<j<<"个括号相匹配的右括号!"<<endl;

    }

 

    cout<<"对于中括号[]的情况:"<<endl;

    for(int i=1;i<=length;i++)

    {

        if(expression[i-1]=='['){LinkedNode t;t.data=i;s2.Push(t);}//左括号,位置进栈

        else if(expression[i-1]==']')

        {

            if(s2.IsEmpty()==false){j=s2.Pop();cout<<j<<""<<i<<"匹配"<<endl;}

            else cout<<"没有与第"<<i<<"个右括号匹配的左括号!"<<endl;

        }

    }

    while(s2.IsEmpty()==false)

    {

        j=s2.Pop();

        cout<<"没有与第"<<j<<"个括号相匹配的右括号!"<<endl;

    }

 

    cout<<"对于大括号{}的情况:"<<endl;

    for(int i=1;i<=length;i++)

    {

        if(expression[i-1]=='{'){LinkedNode t;t.data=i;s3.Push(t);}//左括号,位置进栈

        else if(expression[i-1]=='}')

        {

            if(s3.IsEmpty()==false){j=s3.Pop();cout<<j<<""<<i<<"匹配"<<endl;}

            else cout<<"没有与第"<<i<<"个右括号匹配的左括号!"<<endl;

        }

    }

    while(s3.IsEmpty()==false)

    {

        j=s3.Pop();

        cout<<"没有与第"<<j<<"个括号相匹配的右括号!"<<endl;

    }

}

int main()

{

    char s[100];

    cout<<"请输入要判断的带有三种括号的字符串"<<endl;

    cin>>s;

    PrintMatchedPairs(s);

    return 0;

}

 

 

运行结果:

 

转载于:https://www.cnblogs.com/linruier/p/9485215.html

你可能感兴趣的文章
sqlmap详解
查看>>
2016年7月笔记
查看>>
开源手机自动化测试框架iQuery入门教程(三)
查看>>
利用php Jpgraph绘制柱形图
查看>>
[转载]C-Style Character Strings
查看>>
05.UIDynamic
查看>>
php正确率比较高的安装教程
查看>>
常见26个jquery使用技巧详解(比如禁止右键点击、隐藏文本框文字等)
查看>>
基于ARM+LINUX的无线视频采集系统设计----------项目整体介绍
查看>>
python log
查看>>
迭代器,递归,函数名的使用,闭包
查看>>
DOM结构学习备忘
查看>>
关于idea优化的博客(分享)
查看>>
BZOJ1015[JSOI2008]星球大战starwar[并查集]
查看>>
BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]
查看>>
信息资源管理第一章知识结构
查看>>
LeetCode Bitwise AND of Numbers Range
查看>>
python 的with用途(清理资源和异常处理,同时代码精简)
查看>>
dns server 域名解析总结
查看>>
getHibernateTemplate用法
查看>>