-
由于堆栈的性质,只有弹出顶部元素才能看到下一个元素。
所以,如果你想遍历堆栈,你必须一个接一个地弹出顶部的元素,当堆栈变成空时,你将遍历堆栈。
如您所见,您只能遍历堆栈一次,然后堆栈变为空。
-
遍历预先订购的二叉树(非递归)。
访问 t->data 后,将 t 放入堆栈并遍历左侧子树。
遍历左侧子树时,堆栈的顶部元素应为 t,在堆栈之外,然后依次遍历 t 的右侧子树。
void preorder_stack(bitnode *t)bitnode *stack[maxn];
int top = -1;
while(t ||top!=-1)
while(t)
printf("%c",t->data);
stack[++top] = t;
t = t->lchild;
if(top != -1)
t = stack[top--]
t = t->rchild;
遍历中阶二叉树(非递归)。
首先,将 t 放入堆栈中并遍历左侧子树;
遍历左边子树时,堆栈的顶部元素应该是 t,在堆栈外,访问 t->data,然后按中间顺序遍历 t 的右子树。
void inorder_stack(bitnode *t)bitnode *stack[maxn];
int top = -1;
while(t ||top!=-1)
while(t)
stack[++top] = t;
t = t->lchild;
if(top != -1)
t = stack[top--]
printf("%c",t->data);
t = t->rchild;
遍历后排序二叉树(非递归)。
可以使用标记方法,当节点进入堆栈时,添加一个标志标签(0:左边子树前的字段保护,1:右边子树前的字段保护)。
首先,将 t 和 tag (0) 放入堆栈中并遍历左侧子树。 返回后,将堆栈的 top 标签修改为 1,并遍历右侧子树。 最后,访问根节点。
void postorder_stack(bitnode *t)bitnode *stack[maxn];
bool tag[maxn];
int top = -1;
while(t ||top!=-1)
while(t)
stack[++top] = t;
tag[top] = 0;
t = t->lchild;
t = stack[top--]
printf("%c",t->data);
if(top != -1)
tag[top] = 1;设置顶部堆栈标记。
t = stack[top];以保存在堆栈顶部的指针为例。
t = t->rchild;
else break;
-
如果您使用的是数组 a, int index,则可以使用 :p ush(num) 函数:a[index] = num; index ++pop() 为:
index --return a[index]。
语言特性:在C++中,类是支持数据封装的工具,对象是数据封装的实现。 C++ 通过建立用户定义的类来支持数据封装和数据隐藏。
在面向对象的编程中,合法操作的数据和函数被封装为类定义。 对象被描述为具有给定类的变量。 每个给定类的对象都包含该类指定的许多私有、公共和受保护成员。
-
你是用数组和索引还是用链表实现它?
如果您使用的是数组 a、int 索引,则可以使用:
push(num) 函数为:a[index] = num; index ++
pop() 为: index --return a[index];
empty() 是: 确定索引是否为 “=0”,所以你只需要:
while( !empty())
-
使用 while 确定堆栈是否为空。
您可以依次从堆栈中输出几个数字。
-
这是一个浓缩的**,也许你可以这样写来理解它。
void visit(int e)
cout<}这里你的堆栈必须是连续的,基点指向低地址,顶点指向高地址,如果它是一个类,那么你必须重构迭代器并重载一个 ++ 方法作为你的基,因为堆栈的定义是从堆栈的顶部访问的,但可以从堆栈的底部访问, 但这颠覆了栈的概念,而且大多数人不会这样做——就程序本身而言,存在某些bug,Big-endian 模式和 small-endian 模式可能是相同的两种情况。
-
这是带有 visit 函数的 stacktra 函数的参数,属于 ** 函数(详见相关信息)。 在这个问题中,不要使用这个参数,它应该是一样的,直接(stacktra(sqstack s)"sqstack s"这个参数对于需要遍历的堆栈来说是必不可少的。 ),然后在 stacktra 函数中调用 visit 函数。
void(* visit)(int) 这是函数指针的定义(所以也可以是: void (* 只是可读,差):调用时,stacktra(s,v) 会做,函数指针会指向 visit 函数。
遍历的过程很容易理解:简单来说,如果数组包含n个元素,则从数组的0位置开始,依次访问数组的n-1位置; 在这个问题中,很明显,堆栈是存储数据的向量(数组),base是数组的lo(0); 堆栈的顶部,即数组的 hi(n)
注意:(top 是一个开放区间,所以没有 = in while,并且数组访问,i.)<一个意思)。
-
3.当用户离开一个任务一段时间后,系统会清理任务中除了rootactivity之外的活动,如果用户回来,就会显示rootactivity,就像用户离开又回来一样,就是放弃之前的事情,重新开始一个新的事情。 以上是默认情况,有一些活动属性可用于控制和修改这些行为。
alwaysretaintaskstate
如果任务中根活动的 alwaysRetainTaskState 属性设置为 true,则不会出现上述默认情况,并且该任务即使在一段时间后也会保留所有活动。
cleartaskonlaunch
如果任务中根活动的 cleartaskOnLaunch 属性设置为 true,而不是 alwaysretaintaskstate,则系统将立即清理任务中除根活动之外的所有活动,即使它保留了一秒钟。
-
使用循环来确定堆栈的 size() 是否为 0,否则 pop() 将执行一次,直到达到 0。
pop() 函数删除堆栈的最顶层元素。 如下所示,** 清单并清空堆栈。
while( !
-
似乎不是。
您可以编写一个循环来查看堆栈是否每次都是空的。
如果它不为空,它会弹出
-
您没有内存错误,您访问了未分配的地址。 这是由内存越界、不应写入的内存的越界写入区域引起的。
内存地址空间只能通过申请来使用,但不仅对你,也对C++运行时使用,它有一些全局变量,包括你的新内存的记录,包括新内存的大小,以及起始地址。 如果越界修改内存,有两种可能:1)可以访问未申请的地址空间,直接报错,2)可以修改未请求的内存地址空间,如C++运行时的全局变量。
问题的本质是你之前已经越过边界访问了内存空间,所以仔细检查你的**。
-
那你就只能自己写了。
for (int i = ; i > 0; -i);
-
你上去问,有一个专门的程序员论坛。
-
不,堆栈是一个适配器,接口很少。 底层容器的 deque 或列表具有隐藏的 clear 功能。
-
堆栈的清空操作是将堆栈保留到空为止,你可以这样写,而不必考虑寻找任何模板函数来实现它。
-
根据堆栈中的类型,如果它不是指针,则可以执行此操作(此处使用 int 作为示例)。
stacks;
if (!assert(;此时,s 被清空。
-
C++ Stack 是对容器类的改编,它为程序员提供了堆栈的全部功能,——即实现 FILO 数据结构。
操作:比较和分配堆栈。
如果堆栈为空,empty() 返回 true。
pop() 删除堆栈顶部元素。
push() 将一个元素添加到堆栈的顶部。
size() 返回堆栈中的元素数。
top() 返回堆栈顶部元素。
你可以写你自己的 empty() empty-empty
-
如上所述,对于 C++ 堆栈,pop 是指删除堆栈顶部的元素,而 top 是取出堆栈顶部元素的内容但不删除它。 所以你这里要做的 pop 其实是上面两个操作的组合,所以你应该写 s2[len] = ; 就是这样。 此外,对于字符串,C 样式的字符串类型是 char*,而对于 char* 操作,函数大多以 或 定义,函数多以 str....
例如,您的 strcmp; C++ 样式是 String 类,定义在 中,String 类有很多现成的方法,只需要 S1 !,就可以比较它们是否相等= s2 可以像其他变量一样写成。
-
pop 没有返回值,先使用 top,然后使用 pop。
对于字符串变量,strcmp 不能更改为 strcmp(,,can directly s1!)= s2。
-
strcmp 函数的原始形式是 int strcmp(char*,char*),不能传入字符串对象。
-
std::stack 只是一个适配器,需要一个实际的容器(第二个参数)来实现其功能。 此容器必须提供以下功能:
空大小 后推 弹出 后退堆栈使用 vector 作为底层数据结构 这意味着您对堆栈所做的任何事情都将传输到向量,例如调用堆栈的推送
-
默认情况下,STL 使用的适配器是双端队列,即使用双端队列来实现它,一端是封闭的,只有另一端可以插入和删除。
当然,您也可以使用列表来执行此操作。