LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: sswd

求助:写了个栈的实现及应用。实现中出错。

[复制链接]
发表于 2003-7-19 08:27:31 | 显示全部楼层
找到一个错误:
stq s;
InitStack(s);
因为s是指针,所以必须为s分配内存,InitStack里只为s->base分配了内存,没有为s分配内存,所以有段错误。
 楼主| 发表于 2003-7-19 23:22:30 | 显示全部楼层
谢谢libinary兄为我看程序(看程序很烦人的)。

今天发现了另外一个可用于栈的教学的程序,google上找的,铁出来,希望对大家有用。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define ERROR 0
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define EQUAL 1
  8. #define OVERFLOW -1
  9. #define STACK_INIT_SIZE 100
  10. #define STACKINCREMENT 10

  11. typedef int Status ;

  12. struct STU{
  13.   char name[20];
  14.   char stuno[10];
  15.   int age;
  16.   int score;
  17. };
  18. typedef struct STU SElemType;

  19. struct STACK
  20. {
  21.   SElemType *base;
  22.   SElemType *top;
  23.   int stacksize;
  24. };

  25. typedef struct STACK SqStack;
  26. typedef struct STACK *pSqstack;

  27. Status InitStack(SqStack  **S);
  28. Status DestroyStack(SqStack *S);
  29. Status ClearStack(SqStack *S);
  30. Status StackEmpty(SqStack S);
  31. int StackLength(SqStack S);
  32. Status GetTop(SqStack S,SElemType *e);
  33. Status Push(SqStack *S,SElemType e);
  34. Status Pop(SqStack *S,SElemType *e);
  35. Status StackTraverse(SqStack S,Status (*visit)());

  36. Status InitStack(SqStack **S)
  37. {
  38.   (*S)=(SqStack *) malloc(sizeof(SqStack));
  39.   (*S)->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
  40.   if(!(*S)->base)exit(OVERFLOW);
  41.   (*S)->top=(*S)->base;
  42.   (*S)->stacksize=STACK_INIT_SIZE;
  43.   return OK;
  44. }

  45. Status DestroyStack(SqStack *S)
  46. {
  47. free(S->base);
  48. free(S);
  49. }

  50. Status ClearStack(SqStack *S)
  51. {
  52.   S->top=S->base;
  53. }

  54. Status StackEmpty(SqStack S)
  55. {
  56.   if(S.top==S.base) return TRUE;
  57.   else
  58.     return FALSE;
  59. }

  60. int StackLength(SqStack S)
  61. {
  62.   int i;
  63.   SElemType *p;
  64.   i=0;
  65.   p=S.top;
  66.   while(p!=S.base)
  67.     {p++;
  68.      i++;
  69.     }
  70. }

  71. Status GetTop(SqStack S,SElemType *e)
  72. {
  73.   if(S.top==S.base) return ERROR;
  74.   *e=*(S.top-1);
  75.   return OK;
  76. }

  77. Status Push(SqStack *S,SElemType e)
  78. {
  79. /*
  80.   if(S->top - S->base>=S->stacksize)
  81.    {

  82.      S->base=(SElemType *) realloc(S->base,
  83.             (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
  84.      if(!S->base)exit(OVERFLOW);
  85.      S->top=S->base+S->stacksize;
  86.      S->stacksize += STACKINCREMENT;
  87.    }
  88.   */

  89.   *(S->top++)=e;
  90.   return OK;
  91. }

  92. Status Pop(SqStack *S,SElemType *e)
  93. {
  94.   if(S->top==S->base) return ERROR;
  95.   *e=*--S->top;
  96.   return OK;
  97. }

  98. Status StackPrintElem(SElemType * e)
  99. {
  100.   printf("%s  %s  %d  %d\n",e->name,e->stuno,e->age,e->score);
  101. }
  102. Status StackTraverse(SqStack S,Status (*visit)())
  103. {
  104.   while(S.top!=S.base)
  105.      visit(--S.top);
  106. }

  107. main()
  108. {
  109.   SElemType e;
  110.   SqStack *Sa;

  111.   printf("\n\n-------------------SqStack Demo is running...----------------\n\n");
  112.   printf("First is Push function.\n");

  113.   InitStack(&Sa);

  114.   strcpy(e.name,"stu1");
  115.   strcpy(e.stuno,"100001");
  116.   e.age=80;
  117.   e.score=1000;

  118.   printf("   Now Stack is Empty.\n");
  119.   StackTraverse(*Sa,StackPrintElem);

  120.   Push(Sa,e);

  121.   printf("   Now Stack has one element.\n");
  122.   StackTraverse(*Sa,StackPrintElem);

  123.   strcpy(e.name,"stu3");
  124.   strcpy(e.stuno,"100002");
  125.   e.age=80;
  126.   e.score=1000;
  127.   Push(Sa,e);
  128.   printf("   Now Stack has another element.\n");
  129.   StackTraverse(*Sa,StackPrintElem);

  130.   printf("   Now Pop Stack,the top elem put into variable e.\n");
  131.   Pop(Sa,&e);
  132.   printf("%s\n%s\n%d\n%d\n",e.name,e.stuno,e.age,e.score);

  133.   printf("   Let's see the left of Stack's elem:\n");
  134.   StackTraverse(*Sa,StackPrintElem);

  135.   getchar();
  136.   printf("\n\n\nWelcom to visit [url]http://zmofun.topcool.net\n\n[/url]");
  137. }
复制代码
 楼主| 发表于 2003-7-19 23:44:55 | 显示全部楼层
终于把栈给整明白了。不过上面这个程序写的好像有些问题,不过可以运行
就是下面这个函数

  1. int StackLength(SqStack S)
  2. {
  3.   int i;
  4.   SElemType *p;
  5.   i=0;
  6.   p=S.top;
  7.   while(p!=S.base)
  8.     {p++;
  9.      i++;
  10.     }
  11. }
复制代码

他是从栈顶开始计数的,栈顶应该比栈底大,但是循环体却是q++,不明白
发表于 2003-7-20 00:27:12 | 显示全部楼层
是写错了吧,而且用S.top - S.base不是挺简单的吗?为什么搞的那么麻烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表