栈的基本操作+实例:迷宫求解
#include<iostream>
using namespace std;
struct Node {
int datai;
int dataj;
Node* next;
};
struct Stack {
Node* pTop;
Node* pBottom;
};
void Init(Stack* pS);
void Push(Stack* pS, int vali, int valj);
bool Pop(Stack* pS);
bool getTop(Stack* pS, int& vali, int& valj);
bool isEmpty(Stack* pS);
int getSize(Stack* pS);
void Travers(Stack* pS);
int main() {
Stack s;
int i = 0, j = 0;
int a[10][10] = { 0,0,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,0,1,0,
0,1,1,0,1,1,1,0,1,0,
0,1,1,1,1,0,0,1,1,0,
0,1,0,0,0,1,1,1,0,0,
0,1,1,1,0,1,1,1,0,0,
0,1,0,1,1,1,0,1,1,0,
0,0,0,0,0,1,0,0,1,0,
0,1,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0, };
Init(&s);
Push(&s, 1, 1);
i = 1;
j = 1;
while (i != 8 || j != 8) {
if (a[i+1][j] == 0) {
if (a[i][j + 1] == 0) {
if (a[i - 1][j] == 0) {
if (a[i][j - 1] == 0) {
a[i][j] = 0; Pop(&s); getTop(&s, i, j);
}
else { j--; Push(&s, i, j); a[i][j] = 0;}
}
else { i--; Push(&s, i, j); a[i][j] = 0;}
}
else { j++; Push(&s, i, j); a[i][j] = 0;}
}
else { i++; Push(&s, i, j); a[i][j] = 0;}
}
Stack r;
Init(&r);
for (int n = 0; n < getSize(&s); i++)
{
getTop(&s,i,j);
Pop(&s);
Push(&r, i, j);
}
Travers(&r);
}
void Init(Stack * pS){
pS->pTop = new Node();
if (pS->pTop == NULL) {
cerr << "动态内存分配失败!" << endl;
exit(1);
}
pS->pBottom = pS->pTop;
pS->pTop->next = NULL;
}
void Push(Stack* pS, int vali,int valj) {
Node* newNode = new Node();
if (newNode == NULL) {
cerr << "动态内存分配失败" << endl;
exit(1);
}
newNode->datai = vali;
newNode->dataj = valj;
newNode->next = pS->pTop;
pS->pTop = newNode;
}
void Travers(Stack* pS) {
Node* p = pS->pTop;
while (p!=pS->pBottom)
{
cout << '('<<p->datai + 1<<','<<p->dataj + 1 <<')'<< "—>";
p = p->next;
}
cout << endl;
}
bool isEmpty(Stack* pS) {
if (pS->pTop == pS->pBottom)
return true;
return false;
}
bool Pop(Stack* pS) {
if (isEmpty(pS))
return false;
Node* r = pS->pTop;
pS->pTop = r->next;
delete r;
r = NULL;
return true;
}
bool getTop(Stack* pS, int& vali,int& valj) {
if (isEmpty(pS))
return false;
vali = pS->pTop->datai;
valj = pS->pTop->dataj;
return true;
}
int getSize(Stack* pS) {
int len = 0;
Node* p = pS->pTop;
while (p != pS->pBottom) {
len++;
p = p->next;
}
return len;
}