一江春水向东流

做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。

  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 阅读(489) 评论(0)  编辑  收藏 所属分类: 算法及数据结构

只有注册用户登录后才能发表评论。


网站导航: