实验3 栈操作 一、 实验的目的要求 1、 了解顺序栈的特性,以及它们在实际问题中的应用。 2、 掌握栈表的实现方法,以及它们的基本操作。 二、 题目、栈操作 1、设两个顺序栈共享空间,试写出两个栈公用的栈操作算法PuSh(x,k)和 POP(k),其中k 为0 或1,用以指示栈号。编写一个完整的程序实现。 2、设一批数据有正有负,试用栈对它们进行调整,使输出时所有负数都在正数之前。编写一个完整的程序实现。 三、 算法描述 实现共享栈:线性表(a0,a1,…,an)是一种逻辑结构,若在计算机中对它采用顺序栈存储结构来存储,则就是栈表。两个栈表共享一段内存空间图示如下: 0 maxsize-1 2 4 3 1 Top[0] top[1] 在数据结构中用C 语言来描述,可以利用数组表示顺序表。将两个原表A 和B 存放在一个数组的存储空间(a0,a1,a2,…,amaxsize-1)中,实现方法是:设置两个栈顶指针变量 top[0]和top[1],开始时top[0]=-1 和top[1]=maxsize 表示两个栈均为空,然后根据变量 k 是 0 还是 1,分别进行入栈和出栈操作。 调整数据正负:当数据为负时直接输出,若为止则进栈。当输入数据处理完后,栈内都为正数,将其依次出栈输出即可。 四、 程序清单 #include #include #include #define maxsize 50 typedef struct //栈的类型定义 { int data[maxsize]; int top[2]; }sqstack; int empty_in(sqstack *S) //输入时判断满栈 { if(S->top[0]+1==S->top[1]) { printf("两个栈均满,不能输入!\n"); return 0;} if((S->top[0]==-1)&&(S->top[1]==maxsize)) { printf("两个栈均为空,能够输入数据!\n"); return 1; } if((S->top[0]!=-1)&&(S->top[1]==maxsize)&&(S->top[0]+1!=S->top[1])) { printf("可以向栈内输入元素!\n"); return 1; } if((S->top[0]==-1)&&(S->top[1]!=maxsize)&&(S->top[0]+1!=S->top[1])) { printf("可以向栈内输入元素!\n"); return 1; } if((S->top[0]+1)!=(S->top[1])) { printf("可以向栈内输入元素!\n"); return 1; } } int empty(sqstack *S) //判断空栈 { int a=1,b=2,c=3,d=4; if((S->top[0]==-1)&&(S->top[1]==maxsize)) { printf("两个栈均为空!\n"); return a; } if(S->top[0]==-1) { printf(" 零号栈为空!\n"); return b; } if(S->top[1]==maxsize) { printf("一号栈为空!\...