一江春水向東流

          做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

          /****************a simple stack**********************************/

          #include <stdio.h>

          #define STACK_INIT_SIZE 100
          #define STACKINCREMENT? 10
          typedef int bool;
          #define TRUE?? 1
          #define FALSE? 0
          typedef struct
          {
          ?char *base;
          ?char *top;
          ?int stacksize;
          }sqStack;

          //=======================function protoType=============================
          bool InitStack(sqStack *stk);
          bool DestroyStack(sqStack *stk);
          bool ClearStack(sqStack *stk);
          bool StackEmpty(sqStack stk);
          int? StackLength(sqStack stk);
          bool GetTop(sqStack stk, char *item);
          bool Push(sqStack *s, char item);
          bool Pop(sqStack *s, char *item);

          bool InitStack(sqStack *stk)
          {
          ?stk->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
          ?if (!stk->base)
          ?return FALSE;
          ?stk->top = stk->base;
          ?stk->stacksize = STACK_INIT_SIZE;
          ?return TRUE;
          }

          bool GetTop(sqStack stk, char *item)
          {
          ?if (stk.top == stk.base)
          ?return FALSE;
          ?item = (stk.top-1);
          ?return TRUE;
          }

          bool Push(sqStack *stk, char item)
          {
          ?if (stk->top - stk->base >= stk->stacksize)
          ?{
          ??printf("allocate New Mem\n");
          ??stk->base = (char *)realloc(stk->base, (stk->stacksize + STACKINCREMENT)* sizeof(char));
          ??if (!stk->base)
          ??return FALSE;
          ??stk->top = stk->base + stk->stacksize;
          ??stk->stacksize += STACKINCREMENT;
          ?}
          ?*stk->top = item;
          ?stk->top++;
          ?return TRUE;
          }

          bool Pop(sqStack *stk, char* item)
          {
          ?if (stk->top == stk->base)
          ?return FALSE;
          ?stk->top--;
          ?*item = *(stk->top);
          ?return TRUE;
          }

          bool StackEmpty(sqStack stk)
          {
          ?if (stk.top == stk.base)
          ?return TRUE;
          ?else
          ?return FALSE;
          }

          bool ClearStack(sqStack *stk)
          {
          ?stk->top = stk->base;
          ?memset(stk->base, 0, sizeof(char));
          ?if (stk->top)
          ?return TRUE;
          ?else
          ?return FALSE;
          }
          bool DestroyStack(sqStack *stk)
          {
          ?free(stk->base);
          ?printf("free memery\n");
          ?return TRUE;
          }????

          int main(int argc, char** argv)
          {
          ?sqStack stk;
          ?char ch;
          ?InitStack(&stk);
          ?ch = getchar();
          ?while(ch != EOF)
          ?{
          ??while(ch != EOF && ch != '\n')
          ??{
          ???switch (ch)
          ???{
          ????? case '#':
          ????Pop(&stk, &ch);
          ????break;
          ????? case '@':
          ????? ?ClearStack(&stk);
          ????? ?break;
          ????? case 'q':???????
          ??????? DestroyStack(&stk);
          ??????? exit(1);
          ??????? break;???????
          ????? default:
          ?????? Push(&stk, ch);
          ???}
          ???ch = getchar();
          ??}
          ??ClearStack(&stk);
          ??if (ch != EOF)
          ??ch = getchar();
          ?}
          ?DestroyStack(&stk);?
          ?return 1;
          }

          特別要注意的是堆棧的中操作棧頂的值,在就是對內存的操作

          posted on 2007-11-13 22:00 allic 閱讀(507) 評論(0)  編輯  收藏 所屬分類: 算法及數據結構
          主站蜘蛛池模板: 大同市| 遂平县| 陇南市| 韩城市| 北碚区| 乌海市| 五莲县| 聊城市| 韶关市| 麟游县| 东兰县| 南阳市| 万宁市| 衢州市| 滦南县| 甘孜县| 凌源市| 雷山县| 阜城县| 曲松县| 庄河市| 凤凰县| 宣化县| 凤山县| 崇信县| 永定县| 贵定县| 神木县| 凌源市| 龙泉市| 广东省| 富源县| 托克逊县| 定兴县| 辽阳市| 临西县| 彩票| 竹北市| 甘肃省| 成武县| 永春县|