Stack
#include "vector.h" template<typename T> class Stack : public Vector<T> { public: void push(T const& e) { insert(size(), e); } T pop() { return remove(size() - 1); } T& top() { return (*this)[size() - 1]; } }; void convert(Stack<char>& S, __int64 n, int base) { static char digit[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; while (0 < n) { int remainder = (int)(n % base); S.push(digit[remainder]); n /= base; } } bool paren(const char exp[], int lo, int hi) { Stack<char> S; for (int i = lo; i <= hi; i++) { switch (exp[i]) { case'(': case'[': case'{': S.push(exp[i]); break; case')':if ((S.empty()) || ('(' != S.pop())) return false; break; case']':if ((S.empty()) || ('[' != S.pop())) return false; break; case'}':if ((S.empty()) || ('{' != S.pop())) return false; break; default:break; } } return S.empty(); } struct Queen { int x, y; Queen(int xx = 0, int yy = 0) : x(xx), y(yy) {}; bool operator== (Queen const& q)const { return (x == q.x) || (y == q.y) || (x + y == q.x + q.y) || (x - y == q.x - q.y); } bool operator!= (Queen const& q)const { return !(*this == q); } }; void placeQueen(int N,Stack<Queen>& solu) { Queen q(0, 0); do { if (N <= solu.size() || N <= q.y) { q = solu.pop(); q.y++; } else { while ((q.y < N) && (0 <= solu.find(q))) { q.y++; } if (N > q.y) { solu.push(q); q.x++; q.y = 0; if (N <= solu.size()) return; } } } while ((0 < q.x) || (q.y < N)); }
#include "stack.h" #include <iostream> using namespace std; int main() { Stack<Queen> solu; placeQueen(5, solu); for (int i = 0; i < 5; i++) { Queen a = solu.pop(); cout << a.x << " " << a.y << endl; } system("pause"); return 0; }
1. 邓俊辉. 数据结构 : C++语言版[M]. 清华大学出版社, 2013.