一、注意点
1、<stack>头文件
入栈,s.push(x);
出栈,s.pop(); (出栈操作只是删除栈顶元素,并不返回该元素)
访问栈顶,s.top()
判断栈空,s.empty(),当栈空时,返回true。
访问栈中的元素个数,s.size()
stack<BinTree*> s; //建一个空栈存放s结点,即 Stack s = CreatStack( MaxSize ) ;
2、非递归后续遍历的两种思路
第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还未被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是否是第一次出现在栈顶。
第二种思路:要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
3、小补充
isalpha()判断一个字符是否是字母
while(scanf("%s",s)==1) //scanf的返回值由后面的参数是否成功读入决定。这里是一个%s参数,成功读入后返回1;若是"%s%s",都成功返回2,都不成功返回0
二、代码及疑问
对于栈在二叉树中的应用还不太明白,尤其是二叉树创建和非递归后序遍历。。。
#include <iostream>
#include<string.h