1、datatype datamaxsize; int top2;sqstack; /定义一个结构体类型的 sqstacksqstack a,*s; / 定义一个结构体类型变量 a和指针变量 sssqstack *init(sqstack *s) / 初始化两个栈均为空, s是指向栈类型的指针s=(sqstack *)malloc(sizeof(sqstack); / 申请空间s-top0=-1; /top1 、top0 分别是第 0 和第 1 个栈的栈顶指针top1=maxsize; return s;int push(sqstack *s,datatype x,int k) / 入栈操作, s
2、是栈顶指针, x是要插入的数, k是栈号if(s-top0+1=s-top1)printf(n); 两个栈均满,不能进栈! n / 判断是否栈满return 0;if(k=0)topk+; / 改栈顶指针加 1或减 1 ,来选择不满的栈elsetopk-;datas-topk=x; /将X 插入当前栈顶return 1;int pop(sqstack *s,int k) / 出栈操作,栈顶元素由参数 x返回int x;if(k=0&top0=-1)|(k=1&top1=maxsize) 栈空 ,不能退栈! nn return 0;x=s-topk; /区栈顶元素给 X if(k=0) / 改栈
3、顶指针加 1 或减 1 ,来选择不满的栈else return x;void get(sqstack *s,int l) /元素输入函数, l来判断是否已经建栈int k=0,x;while(k=1|k=0)if(l=0) 栈还未建立! break; 请选择输入方向,正向 (0) ,方向 (1) ,结束 (2): / 选择要输入的栈号,并输入元素scanf(%d,&k); if(k=0|k=1)x=0; 请输入数据: while(x!=-1)x); if(x=-1)break;push(s,x,k);void check(sqstack *s) / 检测栈内的元素但并不输出int i,l=0;
4、 while(l=0|l=1) 请选择输出方向,正向 (0) ,方向 (1) ,结束 (2): scanf(l); if(l=2) break;else if(l=0&top0=-1)|(l=1& continue;else if(l=0) 正向数据为: for(i=0;itopl;i+)%4d,s-datai); printf(nn 反向数据为: for(i=maxsize-1;ii-)void print(sqstack *s) /元素输出函数int x,z=1,f=1,l=0; 请选择输出方向,正向 (0) ,方向 (1):x=pop(s,l); if(x=0) 选择 1继续 ,0 结束
5、输出: if(l=1) continue; else break; 正向第 %d 个: %dn,z,x); z+; 反向第 %d 个:,f,x); f+;void menu() / 菜单函数 栈的共享实验 n );=n 1. 栈 的 建 立 n 2. 栈的共享输入 n 3. 栈单个的输出 n 4. 栈的检测 n 0. 退 出 实 验 nvoid main() / 主函数int h,k,l=0; /定义 l为标志,判断是否已建栈,如未建立 l=0 ,否则l=1char i; sqstack *s; for(;)menu(); 请选择 0-4 :h); if(h4)n 输 人 错 误 !Enter
6、 y to contunie :%si);system(clselse switch(h)case 1:*n* 栈的建立 *ns=init(s); /栈的建立 l=1;case 2:*n* 栈的共享输入 *n*nget(s,l); / 栈的输入case 3:* 栈单个的输出 * n*nprint(s); / 栈的单个输出printf(case 4:* 栈的检测 * ncheck(s); /对栈内元素的检测printf(case 0: system(* 再 见! *n五、运算结果结果一: 0 号栈输入元素( 1 ,2, 3, 4 , 7, 8, 10), 1 号栈输入元素( 0,5 , 6 )栈
7、的共享实验Enter y to continue : y (回车)* 栈 的 共 享 输 入 *请选择输入方向,正向 (0) ,方向请输入数据: 1 2 3 4 7 8 10 1(1) ,结束 (2): 0(回车) 1 0 5 6 1 (回车) 2 y* 栈 的 检 测 *正向数据为: 1 2 3 4 7 8 10反向数据为: 0 5 6* 栈 的 单 个 输 出 *请选择输出方向,正向 (0) ,方向 (1): 0 (回车)正向第 1 个: 10正向第 2 个: 8正向第 3 个: 17正向第 4 个: 4正向第 5 个: 3正向第 6 个:正向第 7 个:栈空,不能退栈!选择 继续, 1
8、(回车)反向第 1 个: 6反向第 2 个: 5反向第 3 个:栈的共享实验1. 栈的建立2. 栈的共享输入3. 栈单个的输出4. 栈的检测0.退出实 验请选择0-4 : 2 (回车)0. 退 出 实 验请 选 择 0-4 :请选择输入方向,正向 (0) ,方向 (1) ,结束 (2): 1 2 3 4 5 6 7 8 9 10 11 1 (回车) 两栈均满,不能进栈!六、调试小结函数 init (sqstack *s) 中少了一条 s=(sqstack *)malloc(sizeof(sqstack) 语句, 这就导致了栈的内存空间无法分配,所以执行出错。在程序中多加了 get (sqstack *s,int l) 、check (sqstack *s) 、print (sqstack *s) 三个函数以便与栈的输入输出以及对栈的检测(不出栈) 。为了在栈的输入之前判断是否已经建栈,在主函数中定义了一个 l 并定义为 0,当 l = 0时表示还未建栈, l = 1 时表示已经建栈。所以只要将 l 的值传入 get (sqstack *s,int l) 函数中就可以判断在此之前是否已经建栈。七、疑问对标志 l 的赋值只能放在建栈函数 s=init(s) 之后,而不能放在它的前面。如下: s=init(s); 正确 错误! l 的值任然为 0,不赋值为 1 printf(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1