Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68063
  • 博文数量: 16
  • 博客积分: 338
  • 博客等级: 一等列兵
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-25 01:32
文章分类
文章存档

2011年(16)

我的朋友

分类: C/C++

2011-05-04 00:44:15

#include
#include
#include
#include
//定义栈的初始分配空间
#define STACK_INIT_SIZE 100
//栈的分配增量
#define STACKINCRENMENT 10

typedef struct
{
 char *top;//栈顶
 char *base;//栈底
 int stacksize;//当前栈的大小
}stack;

//栈的初始化
stack *initStack(stack *s)
{
 s->base=(char*)malloc(STACK_INIT_SIZE *sizeof(char));
 //假设s没有分配成功
 if(NULL==s)
 {
  exit(-1);
 }
 //栈顶指针指向栈底,也就是说栈顶与栈底都指向同一个位置
 s->top=s->base;
 s->stacksize=STACK_INIT_SIZE;
}

//销毁栈
stack * destoryStack(stack *s)
{
 //如果栈不存在,表示栈根本没有被初始化
 if(NULL==s->base)
 {
  return ;
 }
 //进行销毁,也就是将分配的内存空间收回,将栈的一些参数重新设置
 free(s->base);
 s->top=s->base=NULL;
 s->stacksize=0;
 return s;
}

//清空栈
stack *clearStack(stack *s)
{
 if(NULL==s->base)
 {
  printf("\n Sorry, stack does not exist!\n");
  return ;
 }
 s->top=s->base;
 return s;
}

//取元素
char getStackElem(stack *s)
{
 //保存栈顶元素
 char topElem;
 //如果栈顶指针指向与栈底指针指向同一内存单元时,表示栈为空或者栈不存在
 if(s->top=s->base)
 {
  printf("栈中没有可以被取的元素!\n");
  return ;
 }
 topElem=*(s->top--);
 return topElem;
}
//进栈操作
stack *push(stack *s,char elem)
{
 //s是否已满,若栈满,重新分配空间
 if((s->top-s->base)>STACK_INIT_SIZE)
 {
  s->base=(char*)realloc(s->base,(STACKINCRENMENT+STACK_INIT_SIZE)*sizeof(char));
  if(NULL==s->base)
  {
   return;
  }
  //将栈顶指针指向栈顶
  s->top=s->base+s->stacksize;
  s->stacksize+=STACKINCRENMENT;
 }
 //将元素e,写入栈顶,注意这里可能有错。
 *(s->top)=elem;
 s->top++;
 return s;

}
//出栈
char pop(stack *s)
{
 char elem;
 if(s->top==s->base)
 {
   exit(-1);
 }
 s->top--;
 elem=*(s->top);
 return elem;

}

int main()
{
 stack s;
 int i;
 char *elem="acdef";
 char *temp;
 //栈的初始化;
 initStack(&s);
 //插入元素a,b,c,d,e调用push函数
 printf("进栈顺序:\n");
 temp=elem;
 while(*elem!='\0')
 {
  printf("%3c",*elem);
  elem++;
 }
 elem=temp;
  while(*elem !='\0')
 {
  push(&s,*elem);
  elem++;
 }
 //取出元素,调用pop函数
    printf("\n出栈顺序:\n");
 //while(s.top!=s.base!=NULL)
 while(s.top!=NULL && s.base!=NULL)
 {
  printf("%3c",pop(&s));
 }
 
 clearStack(&s);

 return 1;
}


阅读(2092) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~