一江春水向東流

          做一個(gè)有思想的人,期待與每一位熱愛(ài)思考的人交流,您的關(guān)注是對(duì)我最大的支持。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            44 隨筆 :: 139 文章 :: 81 評(píng)論 :: 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;
          }

          特別要注意的是堆棧的中操作棧頂?shù)闹担诰褪菍?duì)內(nèi)存的操作

          posted on 2007-11-13 22:00 allic 閱讀(513) 評(píng)論(0)  編輯  收藏 所屬分類: 算法及數(shù)據(jù)結(jié)構(gòu)
          主站蜘蛛池模板: 绥宁县| 虹口区| 惠来县| 普安县| 连山| 嫩江县| 米易县| 睢宁县| 金溪县| 梓潼县| 措勤县| 环江| 金湖县| 荃湾区| 长阳| 西宁市| 武清区| 鄂托克旗| 乌海市| 应用必备| 巴青县| 乌鲁木齐县| 乌苏市| 堆龙德庆县| 九龙城区| 伊川县| 松溪县| 宁河县| 井冈山市| 彰化县| 调兵山市| 余庆县| 博湖县| 冷水江市| 台东县| 彰化市| 巩留县| 泾川县| 和林格尔县| 普陀区| 额济纳旗|