Description
假设在表达式中([]())或[([ ][ ])]等为正确的格式,[( ])或([( ))或 (( )])均为不正确的格式。基于栈设计一个判断括号是否正确匹配的算法。
Input
输入数据有多组,每组测试数据一行,一个字符串(长度小于1000),只包含 ‘[‘ ,’]’ ,’(‘ ,‘)’ 。
Output
对于每组测试数据,若括号匹配输出yes,否则输出 no。
Sample Input
[]()[]
([[]])[)
Sample Output
yes
no
嘿嘿,本题没有使用栈的头文件,一切函数都是需要自己定义的
代码区:
#include <cstdio> #include <cstdlib> #include <string.h> #include <iostream> using namespace std; typedef struct stack //定义一个结构体为栈(注意,本题没有使用栈的头文件,一切函数都是自己定义的) { char ch[1000];//存放括号 int top;//栈顶指针(所指的那位置是空的,是栈顶元素的上面) int base;//栈底指针(指向栈底元素的下面) }*ST,Stack;//前者为栈指针,后者为栈结构体 ST InitStack()//创建一个栈 { ST st; st=(ST)malloc(sizeof(Stack));//开辟空间 st->top=0;//将栈顶指针和栈底指针初始化 st->base=0; return st;//返回栈的地址 } int Pop(ST st)//弹出函数,作用是将栈顶元素弹出 { st->top--;//先让指针向下获得栈顶元素的地址 return st->ch[st->top];//返回栈顶元素 } void Push(ST st,char c)//推入函数,作用是将元素推入栈顶 { st->ch[st->top]=c;//推入栈顶 st->top++;//栈顶指针++ } void check(ST st,string a)//判断函数 { int i,t; Push(st,a[0]);//将空白元素推入栈,是因为需要使栈底指针指向空,从下标1开始 for (i=1;i<a.size();i++)//a.size()是指a字符串的长度 { if ((a[i]==']'&&st->ch[st->top-1]=='[')||(a[i]==')'&&st->ch[st->top-1]=='(')) //依次对比字符串中的括号,如果和栈顶的括号匹配的话说明这个括号可以抵消了 //须知,因为栈的性质是先入后出,所以字符串从前往后,栈从后往前,完美! t=Pop(st);//所以需要弹出栈 else Push(st,a[i]);//如果该字符串元素不能完成括号匹配,就先暂时压入栈中(地牢)等待另一半括号来救 } if(st->top==0)//当栈顶指针指向0说明栈中已经没有元素了,也就表面括号已经全部匹配成功了 cout << "yes" << endl; else//反之没有匹配成功 cout << "no" << endl; } int main() { string s;//定义字符串 while(cin >> s)//多组测试数据 { ST st; st=InitStack();//调用函数 check(st,s);//调用函数 } return 0; }
新手上路,有错请指正