在出栈运算中,当栈不为空的条件下,先将栈顶元素赋 给e,然后将栈顶指针减1。对应的算法如下: public bool Pop(restring e) if(StackEmptyO) /栈下溢出时返回alse return false: e=data topl; /取栈顶指针元素的元素 top--; 栈顶指针减1 return true
在出栈运算中,当栈不为空的条件下,先将栈顶元素赋 给e,然后将栈顶指针减1。对应的算法如下: public bool Pop(ref string e) { if (StackEmpty()) //栈下溢出时返回false return false; e=data[top]; //取栈顶指针元素的元素 top--; //栈顶指针减1 return true; }
(4)取栈顶元素 GetTop(e) 在栈不为空的条件下,将栈顶元素赋绐e,不移动栈顶指 针。对应的算法如下: public bool GetTop(restring e) if (StackEmptyO) 栈为空的情况,即栈下溢出 return false; e=data top; /取栈顶指针位置的元素 return true;
(4)取栈顶元素GetTop(e) 在栈不为空的条件下,将栈顶元素赋给e,不移动栈顶指 针。对应的算法如下: public bool GetTop(ref string e) { if (StackEmpty()) //栈为空的情况,即栈下溢出 return false; e=data[top]; //取栈顶指针位置的元素 return true; }
【例3.3】有n个元素(假设元素值为1~n),依1~n的 次序通过一个栈,设计一个算法判断序列str是否得为一个出 栈序列,若是出栈序列,给出操作过程 解:将进栈序列存放到数组中(元素为1~n),判断序 列sr存放到数组b中,设计一个顺序栈st,其栈顶指针为top 令i、j初始值均为0,即分别指向a、b数组的第一个元素 反复执行下列操作:比较栈顶元素 sttop和b机的大小, 着两者不相等,则将叫进栈,ˉ1;否则出栈栈顶元素,加1 当汏于等于n或大于等于n时,上述循环过程结束。如果序列 str是由出栈序列,则此时必有=n,用 mystr字符串保存进栈 和出栈的操作过程。对应的算法如下
【例3.3】 有n个元素(假设元素值为1~n),依1~n的 次序通过一个栈,设计一个算法判断序列str是否得为一个出 栈序列,若是出栈序列,给出操作过程。 解:将进栈序列存放到数组a中(元素为1~n),判断序 列str存放到数组b中,设计一个顺序栈st,其栈顶指针为top。 令i、j的初始值均为0,即分别指向a、b数组的第一个元素。 反复执行下列操作:比较栈顶元素st[top]和b[j]的大小, 若两者不相等,则将a[i]进栈,i加1;否则出栈栈顶元素,j加1。 当i大于等于n或j大于等于n时,上述循环过程结束。如果序列 str是由出栈序列,则此时必有j==n,用mystr字符串保存进栈 和出栈的操作过程。对应的算法如下:
private bool is Serial(intl a, intl, int n, ref string mystr) i int i=0,j=0; int st=new int MaxSize; /用作顺序栈 int top=-1; /用作栈顶指针 while(i<n &&j<n if(top==-1 top =bljD top++; st top]=ai; mysr+=元素"+a[ iToString+"进栈rn"; i++; else {mysr+="元素"+ sttop. ToString+"出栈rn top--;j++; while(top!=-1 & st[top==bljD) mystr+="元素"+ st top ToString0+"出栈rin"; top--;j++ if g-=n) return true; 是出栈序列时返回true else return false: 不是出栈序列时返回 false
private bool isSerial(int[] a,int[] b,int n,ref string mystr) { int i=0,j=0; int [] st=new int[MaxSize]; //用作顺序栈 int top=-1; //用作栈顶指针 while (i<n &&j<n) { if (top==-1 || st[top]!=b[j]) { top++; st[top]=a[i]; mystr+="元素"+a[i].ToString()+"进栈\r\n"; i++; } else { mystr+="元素"+st[top].ToString()+"出栈\r\n"; top--; j++; } } while (top!=-1 && st[top]==b[j]) { mystr+="元素"+st[top].ToString()+"出栈\r\n"; top--; j++; } if (j==n) return true; //是出栈序列时返回true else return false; //不是出栈序列时返回false }
例如,本算法的一次求解结果如下图所示。 例3 判断一个序列是否为出栈序列 元素个数n: 列:1342 判断 判断结果:输入序列是一个出栈序列 操作过程:元素1进 元素2进栈 元素3进栊 元素3出钱 元素4进 元素4出栈 元素2出栊 操作提示区
例如,本算法的一次求解结果如下图所示