新手C语言数据结构问题
题目是:假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈。 在答案中 定义双向栈 #define STACK_INIT_SIZE_100; Typedef struct{ SElemType *base; SElemType *top0,*top1; Intstacksize; }tws; 压栈:Status Push(tws &S,int I,SElemType x){ If( p0> p1) Exit(OVERFLOW); If(i==0){ se[ p0]=x; p0++; } Else if(i==1){ se[ p1]=x; p1++;} Else return ERRPR; Return OK; } 在压栈的时候为什么使用的是数组表示形式? se[ p0]=x; base和top0,top1都是指针,指向数组元素的吧? 如果这样是不是可以直接使用* p0=x;取元素就可以呢?
从答案开头的结构体类型定义中可以看出:base是指针类型变量,存储动态申请来的数组的起始地址(base可以当作数组名使用);top0和top1也是指针类型变量(即栈0和栈1的栈顶指针),但在后面的压栈操作实现中,top0和top1却是当作整型变量使用的(top0存储栈0的栈顶元素所在数组元素的后面一个数组元素的下标,top1存储栈1的栈顶元素所在数组元素的前面一个数组元素的下标),所以答案有误。
应该把开头的"SElemType *top0, *top1;"改为"int top0, top1;"。另外,压栈操作实现中倒数第4行" p1++;"要改为" p1--;"。
补充说明: 如果top0和top1是指针类型变量,那么原压栈操作算法中第4-8行做适当改动: if (i == 0) { * p0 = x; p0++; } else if (i == 1) { * p1 = x; p1--; }。
用( p0> p1)语句判断溢出是错的,应该是对于i=0和1分别判断 p0==0和 p1==stacksize-1。
谢谢小草的回答,如果top0和top1都是int,那么这个初始化 Status InitStack(tws &S){ se=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(! se)exit(OVERFLOW); acksize = STACK_INIT_SIZE; p0= se; p1= se+ acksize-1; return OK; } 是不是到倒数第三和倒数第二行需要这样修改 top0 = 0; top1 = acksize-1;
答:1, 我们先来说明一下“复合赋值运算符” 种类:+= -= *= /= %= 《= 》= &= ^= |= 含义: exp1 op= exp2 ...详情>>