1
这段代码无法正确的出栈入栈,请各位帮忙看看,是哪里出了问题。#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
typedef int status;
typedef struct //声明结构体Production用于表示生产日期
{ int year;
int month;
int day;
}production;
typedef struct
{ intnumber; //商品编号
production date; //商品生产日期
}selemtype;
typedef struct{
selemtype *base;//栈底指针
selemtype *top;//栈顶指针
int stacksize;
}sqstack;
void initstack(sqstack &s)
{
s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
s.top=s.base;
s.stacksize=stack_init_size;
}
void push(sqstack &s,selemtype e)//入栈
{
if(s.top-s.base>=s.stacksize){
s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
if(!s.base)
printf("error");
s.top=s.base+s.stacksize;
s.stacksize+=stack_init_size;
}
*s.top=e;
s.top++;
}
void pop(sqstack &s,selemtype k)//出栈
{
int i=0;
if(s.base==s.top){
printf("栈为空");
}
s.top--;
k=*s.top;
}
status gettop(sqstack s,selemtype k)//取栈顶元素
{
selemtype e;
if(s.top!=s.base){
k=*(s.top-1);
return OK;
}
return ERROR;
}
void print(sqstack &s)//输出
{
selemtype *e=s.base;
int i=0;
while(i<(s.top-s.base))
{
printf("%d ",*e);
i++;
e++;
}
}
status judge(sqstack &s,selemtype e)//栈顶元素大于输入返回1
{
selemtype k;
gettop(s,k);
if(k.date.year>e.date.year){
return OK;
}
else if(k.date.year==e.date.year){
if(k.date.month>e.date.month){
return OK;}
else if(k.date.month==e.date.month){
if(k.date.day>e.date.day){
return OK;
}
else if(k.date.day==e.date.day){
return OK;
}
}
}
else {
return ERROR;
}
}
void Lineup()
{
int i,j=1,t;
sqstack s,temp;
initstack(s);
initstack(temp);
while(j!=4)
{
printf("1.入库2.出库3.查看货物 4.退出\n");
scanf("%d",&j);
switch(j){
case 1:{
selemtype e,k;
printf("请输入商品编号及生产日期:\n");
scanf("%d %d %d %d",&e.number,&e.date.year,&e.date.month,&e.date.day);
if(s.top==s.base)
{
push(s,e);
}
else{
gettop(s,k);
t=0;
while(!t){
pop(s,k);
push(temp,k);
t=judge(s,e);
}
push(s,e);
while(temp.base!=temp.top)
{
pop(temp,k);
push(s,k);
}
}
break;}
case 2: {
selemtype w;
pop(s,w);
printf("该商品编号为%d,生产日期为%d %d %d\n",w.number,w.date.year,w.date.month,w.date.day);
break;}
case 3:{
print(s);
break;}
}
}
}
int main()
{
Lineup();
return 0;
} 这段代码中存在以下问题:
1. 在使用结构体指针作为栈底和栈顶指针时,需要先为其分配内存空间。在initstack函数中,应该使用s.base = (selemtype*)malloc(stack_init_size*sizeof(selemtype))分配内存空间。
2. 在push函数中,当栈已满时,需要重新分配更大的内存空间。但是代码中的重新分配内存的逻辑有问题。正确的逻辑应该是先判断是否分配成功,然后再更新栈顶指针和栈大小。
3. 在pop函数中,应该将栈顶元素赋值给参数k ,而不是将参数k赋值给栈顶元素。
4. 在gettop函数中,应该将栈顶元素赋值给参数k ,而不是将参数k赋值给栈顶元素。
5. 在print函数中,应该打印栈中元素的编号,而不是打印指针的值。
6. 在judge函数中,应该将参数e的日期与栈顶元素k的日期进行比较,而不是将栈顶元素k的日期与参数e进行比较。
下面是修复后的代码:
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
typedef int status;
typedef struct //声明结构体Production用于表示生产日期
{
int year;
int month;
int day;
} production;
typedef struct
{
int number; //商品编号
production date; //商品生产日期
} selemtype;
typedef struct
{
selemtype *base; //栈底指针
selemtype *top; //栈顶指针
int stacksize;
} sqstack;
void initstack(sqstack &s)
{
s.base = (selemtype *)malloc(stack_init_size * sizeof(selemtype));
s.top = s.base;
s.stacksize = stack_init_size;
}
void push(sqstack &s, selemtype e) //入栈
{
if (s.top - s.base >= s.stacksize)
{
selemtype *newbase = (selemtype *)realloc(s.base, (s.stacksize + stackincrement) * sizeof(selemtype));
if (!newbase)
{
printf("error");
return;
}
s.base = newbase;
s.top = s.base + s.stacksize;
s.stacksize += stackincrement;
}
*s.top = e;
s.top++;
}
void pop(sqstack &s, selemtype &k) //出栈
{
if (s.base == s.top)
{
printf("栈为空");
return;
}
s.top--;
k = *s.top;
}
status gettop(sqstack s, selemtype &k) //取栈顶元素
{
if (s.top != s.base)
{
k = *(s.top - 1);
return OK;
}
return ERROR;
}
void print(sqstack &s) //输出
{
selemtype *e = s.base;
int i = 0;
while (e < s.top)
{
printf("%d ", e->number);
i++;
e++;
}
}
status judge(sqstack &s, selemtype e) //栈顶元素大于输入返回1
{
selemtype k;
gettop(s, k);
if (k.date.year > e.date.year)
{
return OK;
}
else if (k.date.year == e.date.year)
{
if (k.date.month > e.date.month)
{
return OK;
}
else if (k.date.month == e.date.month)
{
if (k.date.day > e.date.day)
{
return OK;
}
else if (k.date.day == e.date.day)
{
return OK;
}
}
}
return ERROR;
}
void Lineup()
{
int j = 1, t;
sqstack s, temp;
initstack(s);
initstack(temp);
while (j != 4)
{
printf("1.入库2.出库3.查看货物4.退出\n");
scanf("%d", &j);
switch (j)
{
case 1:
{
selemtype e, k;
printf("请输入商品编号及生产日期:\n");
scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
if (s.top == s.base)
{
push(s, e);
}
else
{
gettop(s, k);
t = 0;
while (!t)
{
pop(s, k);
push(temp, k);
t = judge(s, e);
}
push(s, e);
while (temp.base != temp.top)
{
pop(temp, k);
push(s, k);
}
}
break;
}
case 2:
{
selemtype w;
pop(s, w);
printf("该商品编号为%d,生产日期为%d %d %d\n", w.number, w.date.year, w.date.month, w.date.day);
break;
}
case 3:
{
print(s);
break;
}
}
}
}
int main()
{
Lineup();
return 0;
}
希望以上解答对您有帮助。如果您还有任何问题,请随时提问。 在这段代码中,出栈和取栈顶元素的函数都存在问题,具体如下:
1. 出栈函数pop()的问题:
在函数pop()中,参数k是用于存储出栈元素的,但是在函数中并没有使用到k来修改传入的实参,因此无法正确地出栈。应该改为使用指针作为参数,并且通过指针返回出栈元素。
修改后的pop()函数代码如下:
void pop(sqstack &s, selemtype* k) //出栈
{
if(s.base == s.top){
printf("栈为空");
}
s.top--;
*k = *s.top;
}
2. 取栈顶元素函数gettop()的问题:
在函数gettop()中,参数k是用于存储栈顶元素的,但是在函数中并没有使用到k来修改传入的实参,因此无法正确地取栈顶元素。应该改为使用指针作为参数,并且通过指针返回栈顶元素。
修改后的gettop()函数代码如下:
status gettop(sqstack s, selemtype* k) //取栈顶元素
{
if(s.top != s.base){
*k = *(s.top-1);
return OK;
}
return ERROR;
}
另外,代码中的print()函数也存在问题,因为它试图输出selemtype类型的整数成员number,而应该输出整个结构体的内容。应将print()函数的参数改为selemtype类型的指针,并输出结构体的三个成员。
修改后的print()函数代码如下:
void print(sqstack &s) //输出
{
selemtype* e = s.base;
int i = 0;
while(i < (s.top - s.base))
{
printf("%d %d.%d.%d\n", e->number, e->date.year, e->date.month, e->date.day);
i++;
e++;
}
}
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]