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;
}
main()

  1. 邓俊辉. 数据结构 : C++语言版[M]. 清华大学出版社, 2013.

posted @ 2017-10-11 15:25  Tom_NCU  阅读(268)  评论(0编辑  收藏  举报