行编辑器-data structure

#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;
}


转载于:https://my.oschina.net/u/185531/blog/74567

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值