-
描述
-
假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.
输入一串括号
如果输入的右括号多余,输出:Extra right brackets
如果输入的左括号多余, 输出:Extra left brackets
如果输入的括号不匹配,输出:Brackets not match
如果输入的括号匹配,输出:Brackets match
输入
- {{{{))) 输出
- Brackets not match 样例输入
-
{([)]}
样例输出
-
Brackets not match
此题若借助STL很容易过,但是既然学习的是数据结构还是全部通过最基础的链表实现一下。而且此题好像单借助数组也可实现,记不太清了。之前做过。#include<bits/stdc++.h> using namespace std; template <class T> struct Node { T data; Node<T> *next; }; template<class T>///定义栈 class LinkStack { private: Node<T> *top; public: LinkStack(){top=NULL;} ~LinkStack(); void Push(T x); void Pop(); T Get_Top(); int Empty(){if(top==NULL) return 1;return 0;} }; /* 析构函数 */ template<class T> LinkStack<T>::~LinkStack() { while(top) { Node<T> *p; p=top; top=top->next; delete p; } } /* 入栈 */ template<class T> void LinkStack<T>::Push(T x) { Node<T> *s; s=new Node<T>; s->data=x; s->next=top; top=s; } /* 删除 */ template<class T> void LinkStack<T>::Pop()///注意此处的pop删除有返回值,而STL里面没有,此题不需要可忽略 { if(top==NULL) throw "下溢"; T x=top->data; Node<T> *p; p=top; top=top->next; delete p; return ; //return x; } /* 出栈 */ template<class T> T LinkStack<T>::Get_Top() { if(top==NULL) throw "栈空"; return top->data; } char str[1000]; void match(LinkStack<char>&s,char str[]) { char e; for(int i=0;str[i]!=NULL;i++) { switch(str[i]) { case '(': case '[': case '{': s.Push(str[i]); break; case ')': case ']': case '}': if(s.Empty()){ printf("Extra right brackets\n"); return ; } else e=s.Get_Top(); if(e=='('&&str[i]==')'||e=='['&&str[i]==']'||e=='{'&&str[i]=='}') { s.Pop(); break; } else { printf("Brackets not match\n"); return ; } } } if(s.Empty()) { printf("Brackets match\n"); } else { printf("Extra left brackets\n"); } } int main() { LinkStack<char> My_stack; cin>>str; match(My_stack,str); return 0; }
转载于:https://www.cnblogs.com/dean-SunPeishuai/p/10572298.html