2207122216 发表于 2023-7-7 15:05:47

为什么用不了stl库里的栈 啊

用了说找不到这个头文件,但是这不是c++自带的吗



#include "Stack.h"
#include <iostream>
#include <stdlib.h>                //exit函数要用到
using namespace std;
struct Box        //将每个迷宫格子看成是一个结构体
{
    int x, y, di;
    //x和y分别代表迷宫格子的横纵坐标,di为当前的方向
};
struct Direction        //构建结构体
{
    int incX, incY;
};


typedef struct Node                //这是栈节点
{
    Box data;
    struct Node* pNext;
}Node, *PNODE;

class Stack
{
    private:
    PNODE pTop;
    PNODE pBottom;

    public:
      Stack();
      void initStack(Stack*);
      void pushStack(Stack*, Box);
      
      //将栈中的栈底元素返回并移除,用递归来实现栈逆序遍历的
      Box getElement(Stack&, Box&);
      void reverse(Stack&, Box&);
      
      void traverse(Stack*);
      void pop(Stack*, Box&);
      bool isEmpty(Stack*);
};



Stack::Stack()
{
    //ctor
}

void Stack::initStack(Stack* pS)
{
    pS->pTop = new Node;
    if(nullptr == pS->pTop){
      cout << "动态内存分配失败!" << endl;
      exit(-1);
    }
    else{
      pS->pBottom = pS->pTop;
      pS->pTop->pNext = nullptr;
    }
    return;
}

void Stack::pushStack(Stack* pS, Box temp) //temp是将一个结构体整体入栈
{
    PNODE pNew = new Node;
    pNew->data = temp;
    pNew->pNext = pS->pTop;
    pS->pTop = pNew;
}
/** 这里开始是逆序遍历栈的关键代码,等会详细讲解 */
Box Stack::getElement(Stack& s, Box& temp)
{
    s.pop(&s, temp);
    Box res = temp;
    if(s.isEmpty(&s)) return res;
    else{
      Box last = getElement(s, temp);
      s.pushStack(&s, res);
      return last;
    }
}

void Stack::reverse(Stack& s, Box& temp)
{
    if(s.isEmpty(&s)) return;
    Box i= getElement(s, temp);
    s.reverse(s, temp);
    s.pushStack(&s, i);
}
/****************************************/
void Stack::traverse(Stack* pS)
{
    PNODE p = pS->pTop;                //p是移动指针,在栈顶和栈底间上下移动的
    while(p != pS->pBottom)
    {
      cout << "(" << p->data.x << ", " << p->data.y << ")" << endl;
      p = p->pNext;
    }
    cout << endl;
    return;
}

void Stack::pop(Stack* pS, Box& temp)        //这里的temp一定要 采用引用
{
    if(isEmpty(pS)) return;
    else{
      PNODE r = pS->pTop;
      temp = r->data;
      pS->pTop = r->pNext;
      free(r);
      r = NULL;
      return;
    }
}

bool Stack::isEmpty(Stack* pS)
{
    if(pS->pTop == pS->pBottom)
      return true;
    else
      return false;
}


bool findPath(Stack& s, int M, int N)
{
    int **maze = new int*;                //动态构造二维数组
    for(int i = 0; i < 10; i++){
      maze = new int;
    }

    for(int i = 0; i < M+2; i++){        //动态给定迷宫
      for(int j = 0; j < N+2; j++){
            if(i == 0 || i == M+1)
                maze = 1;
            else if(j == 0 || j == N+1)
                maze = 1;
            else
                cin >> maze;
      }
    }

    Direction direct;                //方向数组(文章上面有图有说到)
    direct.incX = 0; direct.incY = 1;
    direct.incX = 1; direct.incY = 0;
    direct.incX = 0; direct.incY = -1;
    direct.incX = -1; direct.incY = 0;

    Box temp;
    int x, y, di;      //当前正在处理的迷宫格子
    int line, col;    //迷宫格子预移方向后,下一格子的行坐标、列坐标
    maze = -1;
    temp.x = 1;
    temp.y = 1;
    temp.di = -1;                //起始点直接设置为-1代表该格子已访问过了
    s.pushStack(&s, temp);
    while(!s.isEmpty(&s))
    {
      s.pop(&s, temp);        //这里对遇到走不通的格子进行回退时起到关键作用
      x = temp.x; y = temp.y; di = temp.di+1;
      while(di < 4){//走不通时,四个方向都尝试一遍
            line = x + direct.incX;
            col = y + direct.incY;
            if(maze == 0){        //代表 预走 的格子可以走
                temp.x = x; temp.y = y; temp.di = di;
                s.pushStack(&s, temp);
                x = line; y = col; maze = -1;        //标为-1是为了表明该格子已经走过,回溯时不再处理
                if(x == M && y == N){
                        s.reverse(s, temp);
                        return true;   //迷宫有路
                  }
                else di = 0;
            }
            else di++;
      }
    }
    return false;       //迷宫无路
}

int main()
{
    int M, N;
    bool res;
    cout << "请输入迷宫数组行数和列数:";
    cin >> M >> N;
    Stack s;
    s.initStack(&s);
    res = findPath(s, M, N);
    cout << boolalpha << res << endl;        //将bool转换为true/false显示
    cout << endl;
    if(res)
      s.traverse(&s);
    else
      cout << "你被困在迷宫中了,等着受死吧!" << endl;
    return 0;
}

陶远航 发表于 2023-7-7 15:07:00

从你的代码中,我看到你自己实现了一个栈,而没有使用C++标准模板库(STL)中的 std::stack 。如果你想使用STL中的栈,你需要包含 <stack> 头文件,并使用 std::stack 。下面是一个使用STL中的 std::stack 的简化版代码:

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

struct Box {
    int x, y, di;
};

struct Direction {
    int incX, incY;
};

bool findPath(stack<Box>& s, int M, int N, const vector<vector<int>>& maze) {
    Direction direct = {
      {0, 1},
      {1, 0},
      {0, -1},
      {-1, 0}
    };

    int x, y, di;
    vector<vector<int>> visited = maze;
    visited = -1;
    s.push({1, 1, -1});

    while (!s.empty()) {
      Box temp = s.top();
      s.pop();
      x = temp.x; y = temp.y; di = temp.di + 1;

      while (di < 4) {
            int line = x + direct.incX;
            int col = y + direct.incY;

            if (visited == 0) {
                s.push({x, y, di});
                x = line; y = col; visited = -1;

                if (x == M && y == N) {
                  return true;
                } else {
                  di = 0;
                }
            } else {
                di++;
            }
      }
    }
    return false;
}

int main() {
    int M, N;
    cout << "请输入迷宫数组行数和列数:";
    cin >> M >> N;

    vector<vector<int>> maze(M + 2, vector<int>(N + 2, 1));
    for (int i = 1; i <= M; ++i) {
      for (int j = 1; j <= N; ++j) {
            cin >> maze;
      }
    }

    stack<Box> s;
    bool res = findPath(s, M, N, maze);
    cout << boolalpha << res << endl;

    if (res) {
      while (!s.empty()) {
            Box temp = s.top();
            s.pop();
            cout << "(" << temp.x << ", " << temp.y << ")" << endl;
      }
    } else {
      cout << "你被困在迷宫中了,等着受死吧!" << endl;
    }
    return 0;
}


请注意,我已经删除了你自定义的栈类,并用 std::stack 替换了它。同时,我还将原来的二维数组替换为 vector<vector<int>> ,这是一个更现代且易于使用的数据结构。

isdkz 发表于 2023-7-7 15:09:45

根据你给出的代码,你已经实现了一个自定义的 Stack 类,而这个 Stack 类并不是 C++ Standard Template Library (STL) 中的标准库。实际上,你的 Stack 类是基于链表的数据结构实现的。

如果你想使用 C++ STL 中的 stack ,你应该使用如下的方式包含头文件:

#include <stack>


然后你就可以像这样使用 STL 中的 stack:

std::stack<int> s;// 创建一个整数类型的栈
s.push(10);         // 把一个整数压入栈
int top = s.top();// 获取栈顶元素
s.pop();            // 弹出栈顶元素


所以如果你看到 "找不到这个头文件" 的错误,可能是因为你错误地包含了 "Stack.h",而不是<stack> 。确保你在代码中使用正确的库。

另外,值得注意的是,STL 中的stack是一个容器适配器,实际的底层数据结构可以是deque (默认)或者vector , list等其他序列容器。如果你想用链表实现的栈,也可以选择 STL 中的list 。

2207122216 发表于 2023-7-7 15:10:28

陶远航 发表于 2023-7-7 15:07
从你的代码中,我看到你自己实现了一个栈,而没有使用C++标准模板库(STL)中的 std::stack 。如果你想使用ST ...

谢谢,但是有个小问题就是 vector<vector<int>>中间少了空格应该是 vector<vector<int> >

歌者文明清理员 发表于 2023-7-7 15:20:06

isdkz 发表于 2023-7-7 15:09
根据你给出的代码,你已经实现了一个自定义的 Stack 类,而这个 Stack 类并不是 C++ Standard Template Lib ...

算了,我也加入gpt大军吧

isdkz 发表于 2023-7-7 15:20:27

歌者文明清理员 发表于 2023-7-7 15:20
算了,我也加入gpt大军吧

{:10_256:}

zhangjinxuan 发表于 2023-7-7 22:10:30

歌者文明清理员 发表于 2023-7-7 15:20
算了,我也加入gpt大军吧

{:10_277:}
页: [1]
查看完整版本: 为什么用不了stl库里的栈 啊