[一]栈概念:
1.总概:
先进后出的线性表,就像一端不开口的羽毛球筒,先放进去的羽毛球只能最后拿出来。
2.栈顶:
插入,删除元素的一端。
3.栈底:
栈的尾端,见我的博客-数据结构篇之栈,自己写的数组栈才需要讨论栈底。
4.入栈,出栈:
入栈:在栈顶插入元素(意淫放羽毛球的操作);出栈:删除一个元素(拿出一个羽毛球)。
5.空栈:
栈中没有元素。
[二]<stack>功能介绍:
1.头文件
#include<stack>
2.定义一个栈
stack<typename> One_Stack; //定义一个栈,名称为 One_Stack,typename是数据类型,可以是int等
3.出栈入栈
One_Stack.push(a_Elem); //将a_Elem放入栈 One_Stack.pop(); //出栈
4.取栈顶元素
Stack_top_value = One_Stack.top(); //top返回栈顶元素的值 ,赋值给Stack_top_value
5.获得栈内元素个数
Stack_ElemNum = One_Stack.size();
6.交换两个栈
One_Stack.swap(another_Stack); //One_Stack,another_Stack两个栈内容交换
7.emplace():
另一个入栈函数:emplace(),大部分情况和push()一样。
8.empty()
栈空返回true,否则false,true,false不懂自行百度bool类型。
[三]stack应用:括号匹配
/*by 不缩进对齐的渣男 2018/4/12*/ #include<iostream> #include<stack> #define Max_Size 100 using namespace std; stack<char> Bracket; void Clear_Stack() //stack没有清空的成员函数,所以用pop清 { while (!Bracket.empty()) Bracket.pop(); } bool Matching_Bracket(const char* Signal) //进行括号匹配 { for (int i = 0; Signal[i] != '\0'; i++) { switch (Signal[i]) { case '[': case '{': case '(': Bracket.push(Signal[i]); //左括号先进栈 break; case ')': //line 22 to 39 就像消消乐,如果匹配,那么最靠近该类型右括号的肯定是相应类型的左括号,此时左右抵消 if (Bracket.top() == '(') Bracket.pop(); //抵消的操作,出栈这个匹配的左括号 else return false; break; case ']': if (Bracket.top() == '[') Bracket.pop(); else return false; break; case '}': if (Bracket.top() == '}') Bracket.pop(); else return false; break; default: //忽略其他字符 break; } } if (Bracket.empty()) return true; else return false; } int main() { int t; char Signal[Max_Size]; cin >> t; while (t--) { cin >> Signal; //cout << Signal << endl; if (Matching_Bracket(Signal)) //整个过程只有左括号进栈,如果括号匹配,必定抵消后剩下空栈 cout << "yes" << endl; else cout << "no" << endl; Clear_Stack(); } return 0; }
渣男最近ddl压身,说好的stl-list一拖再拖orz,希望快了,不过考虑先出数据结构的栈和队列嘻嘻。