|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这段代码无法正确的出栈入栈,请各位帮忙看看,是哪里出了问题。
- #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){
- 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;
- }
复制代码
希望以上解答对您有帮助。如果您还有任何问题,请随时提问。
|
|