1

我完全理解堆栈应该做什么(后进先出)。这只是让我感到困惑的堆栈的一部分。

typedef struct dynArrStruct
{
    char *location; //element
    int length;  //max size
    int currSize; //top
}dynArr;


dynArr a; //declared in main
//sorry this is an assignment and I try to refrain from posting my full code
//on here b/c of potential cheaters

我将此代码用作我的堆栈。

基本上我的程序应该找到平衡的字符:'{'、'('、'<'、'[' 和它们的关闭计数器部分。

简而言之,每当我找到一个开口支架时,我都会将它推入堆栈。我一直把它推到堆栈上,直到找到一个右大括号,一旦找到一个右大括号,我就需要弹出堆栈。

我感到困惑的是变量 char* 位置。

假设我的字符串是“()”

在 GDB 中:

如果我读入'('我将它推入堆栈......如果我读入')'我会弹出它。

当我这样做时: p a->location 它会打印出“()”

我只是想知道每次弹出堆栈或弹出与a->位置无关的堆栈时,我是否应该从a->位置的值中删除“()”?

换句话说,它应该在弹出后打印出“”吗?

如果这个问题没有意义,我提前道歉

4

2 回答 2

2

是的,从堆栈中弹出一个元素后,它应该不再可以在堆栈上访问。代表可访问元素数量的堆栈大小也应该减一。访问顶部值和弹出顶部值之间的区别是 C++ STL(我知道您正在使用 C 语言,但这只是一个示例)提供两种不同函数来弹出和访问顶部的原因之一对象中的值std::stack。该std::stack::top方法允许您实际访问堆栈顶部的元素,而该std::stack::pop方法通过将元素从顶部“弹出”来删除它。如果你要和一个人一起去pop但是,该方法既应该返回堆栈顶部的值的副本,又应该从堆栈数据结构中删除该值的内部表示。

于 2013-02-21T03:26:10.117 回答
2

由于您尚未发布代码,因此很难确定,但我怀疑您将指针(例如 char * 位置)与其指向的内容混淆了。当前指向字符串“()”的指针将在 gdb 中打印为 (),但指向(堆栈顶部)的字符将只是 '('。

如果您至少发布部分代码,则更具体会更容易。

于 2013-02-21T03:28:19.900 回答