包含的内容
1.从回调函数到STL。
2.队列 queue / deque的STL库。
2.优先队列priority_queue 的STL库,大小堆方法。
4.用栈和队列的STL解决问题。
4.1. 八皇后问题。
4.2.多括号匹配问题。
4.3.马踏棋盘问题。
从回调到STL
介绍一些回调,再列举STL的队列和栈。
C语言的回调
#include<stdio.h> //回调方法一 void print(int n) { printf("调用 print() 输出%d\n",n); } void show1(int a,void (*ptr)()) { (*ptr)(a);//也可以直接用 ptr(a); 因为函数指针可以直接使用。 } void print2(int s) { printf("调用print2(),打印%d \n",s); } //回调方法二 用别名调用。 typedef void (*funtypename)(int n);//print(int n) 和 print2() 都满足该格式. void show2(int a,funtypename f) { f=print; f(a); f=print2; f(a); } int main() { show1(111,print); printf("*************\n"); show2(22,print); return 0; }运行结构如果。
从C++的回调
#include<cstdio> #include<queue> #include<cstdlib> #include<iostream> #include<ctime> using namespace std; void print(int n) { printf("%d print() 被调用\n",n); } typedef void (*callback)(int n);//和print(int )一个格式 void show(int n,callback f)//用typedef调用 { f=print; f(n); } void show2(int n,void (*ptr)(int))//不用typedef调用 { ptr(n); } int main() { callback p;//p是函数指针.等同于下句 p2 void (*p2)(int n); show(1111,p); show(1111,p2); show2(2222,print); return 0; }运行结果如果
C++ 类仿函数
#include <iostream> using namespace std; typedef void(*Fun)(void); inline void TextFun(void) { cout << "普通回调函数" << endl; } class TextFunor { public: TextFunor() { cout<<"构造"<<endl; } ~TextFunor() { cout<<"析构"<<endl; } void operator()(void) const { cout << "()重载函数" << endl; } }; void ForText(Fun pFun, TextFunor cFun) { pFun(); cFun(); } int main() { TextFunor cFunor; ForText(TextFun, cFunor); return 0; }
STL的queue
STL的priority_queue
priority_queue 大小堆建立方法
priority_queue<tyoe,container,functional> 默认大顶堆,大的在队首。默认用operator<() 比较。
优先队列改为小堆的方法:
如int类的普通类型 用 priority_queue<int,vector<int>,greater<int>>自定义类型,重写operator<()【故意把小于写成大于不就成小堆了吗】或重写仿函数。
重写仿函数 priority_queue<int,vector<Node>,cmp>;cmp代表比较函数,(可以是内置的greater,less,也可以是防函数)写法如下。
#include <iostream> #include<queue> #include<vector> #include<algorithm> using namespace std; typedef struct Node { int x; int y; bool operator()(Node a,Node b)//用于下文比较的仿函数。 { return a.x>b.x; } void print() { cout<<"x="<<x<<" "<<"y="<<y<<endl; } }Node; //在外面重载才能把 bool operator >(Node a,Node b)//重载大于,可用greater()函数。 { return a.x>b.x; } bool operator <(Node a,Node b)//优先队列默认重载小于,有了小于可用于Node的入队。 { return a.x<b.x; } struct cmp// 这是一个外部写的仿函数。 { bool operator()(Node a,Node b) { return a.x>b.x; } }; int main() { priority_queue<Node,vector<Node>,greater<Node>> a; //priority_queue<Node,vector<Node>,Node> a; //priority_queue<Node,vector<Node>,cmp> a; 没有重载大于就自己写仿函数这样用。 //priority_queue<Node,vector<Node>,less<Node>> a; Node b[3]; b[0].x=b[0].y=1; b[1].x=b[1].y=2; b[2].x=b[2].y=3; a.push(b[0]); a.push(b[1]); a.push(b[2]); Node c; c=a.top(); c.print(); a.pop(); c=a.top(); c.print(); return 0; }
C++的stack
deque
用堆栈的 STL 解决问题
多括号匹配
#include <iostream> #include<stack> #include<algorithm> using namespace std; // <{>} <>{}(<>) int main() { stack<char> a;//() [] {} <> char brackets[40]; loop: scanf("%s",&brackets); int i=0; int b=true; while(brackets[i]!='\0') { switch(brackets[i]) { case '(': { a.push('('); break; } case ')': { if(a.top()!='(') { b=false; break; } else a.pop(); break; } case '[': { a.push('['); break; } case ']': { if(a.top()!='[') { b=false; break; } else a.pop(); break; } case '{': { a.push('{'); break; } case '}': { if(a.top()!='{') { b=false; break; } else a.pop(); break; } case '<': { a.push('<'); break; } case '>': { if(a.top()!='<') { b=false; break; } else a.pop(); break; } default: { break; } } if(b==false) { break; } i++; } if(b) { printf("括号匹配\n"); } else { printf("括号不匹配\n"); } return 0; }
8皇后
#include <iostream> using namespace std; int kind=0; const int N=8; int arr[N+1],column[N+1],Left[2*N+1],Right[2*N+1]; void tryit(int i) { int j; for(j=1;j<=8;j++) { if(!column[j]&&!Left[i-j+8]&&!Right[i+j]) { arr[i]=j;column[j]=1;Left[i-j+8]=1;Right[i+j]=1; if(i<8) { tryit(i+1); } else { kind++; } column[j]=Left[i-j+8]=Right[i+j]=0; } } } int main() { tryit(1); printf("%d",kind); return 0; }
马踏棋盘问题
#include <iostream> #include<queue> using namespace std; int Next[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}}; int map[8][8]={0}; typedef struct Node { int x; int y; int step; }Node; int main() { queue<Node> a; Node Firstone={0,0,1}; a.push(Firstone); map[0][0]=1; Node Nextone; Node Nowone; int count=2; while(!a.empty()) { for(int i=0;i<8;i++) { Nextone.x=a.front().x+Next[i][0]; Nextone.y=a.front().y+Next[i][1]; if(Nextone.x<0||Nextone.y<0||Nextone.x>=8||Nextone.y>=8) { continue; } if(map[Nextone.x][Nextone.y]==0) { map[Nextone.x][Nextone.y]=count; Nextone.step=a.back().step+1; a.push(Nextone); count++; } } a.pop(); } printf("广搜法,马踏棋盘的顺序:\n"); for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { printf("%3d ",map[i][j]); } printf("\n"); } return 0; }