ex4_3:——扩展题(必做)
1)两个栈共用一个数组空间,它们的栈底分别在数组两端,栈顶相向而行。编写入栈和出栈函数,实现两个栈元素分别的(但共用)入栈和出栈。
2)main中函数完成以下测试:
a、能否在共用空间上实现两个独立的栈:即能否向两个栈分别输入元素;能否分别从两个栈取出元素,每个栈取出的元素的顺序符合各自栈的特点
b、能否在共用空间用满时,及时制止新的入栈行为。
例如:
假设数组大小为6,main函数实现以下动作,向栈1接连入栈4个元素后,向栈2入栈2个元素致栈满,再向栈2输入一个元素,将报错。接着从栈1出栈1个元素,再向栈2入栈,就会成功。最后,两个栈分别出空,观察输出顺序是否满足栈的特点。
#include
#include
#define N 5
#define true 1
#define false 0
typedef struct
{
int data[N];
int front,rear;
int flag;
}node;
node* initial(node* q)
{
q = (node*)malloc(sizeof(node));
if (q == NULL) return 0;
q->front=q->rear=q->flag = 0;
return q;
}
node* enter(node *p, int x) //入队列函数
{
if (p->rear == p->front && p->flag == 1)
{
printf("队列已满\n");
return (false);
}
else
{
p->data[p->rear] = x;
p->rear = (p->rear + 1) % N;
return p;
}
}
int out(node* t) //出队列函数
{
int x;
if (t->rear == 0&&t->front==0 && t->flag == 0)
{
printf("该队列不存在");
return (false);
}
else
{
x = t->data[t->front];
t->front = (t->front + 1) % N;
}
return x;
}
int main()
{
node *p;
p=initial(&p);
int i, x=1,flagmain = 0,n;
p->front = p->rear =p->flag = 0;
while (1)
{
printf("请输入你想进行的操作:输入1进行enter、输入2进行out\n");
scanf_s("%d", &n);
switch (n)
{
case 1:
{
if (flagmain >= 5)
{
printf("你不能操作enter功能!\n\n");
break;
}
printf("请输入数字并输入0来结束(0不计入队列中):\n");
scanf_s("%d", &x);
while (x != 0)
{
p=enter(p, x);
flagmain++;
if (flagmain == 5) p->flag = 1;
scanf_s("%d", &x);
}
break;
}
case 2:
{
printf("请输入你想从队列中out多少数:\n");
scanf_s("%d", &x);
for (i = 0; i < x; i++)
{
out(&p);
flagmain--;
}
if (flagmain == 5)
p->flag = 0;
break;
}
}
}
return 0;
}
0x00007FF6F6AF1CFA 处(位于 Project2.exe 中)引发的异常: 0xC0000005: 读取位置 0x000000A7A5A32F78 时发生访问冲突。
不知道怎么解决
node *initial(node *q) 你代码中这里传q没意义,可改为node *initial(),
调用的p=initial(&p),需要函数参数类型为node**,这样才能在函数中改变变量的指向。也不需要返回。
后面的out(&p),同理,不需要加&。