【算法】栈的C语言实现

</pre><pre name="code" class="cpp">#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
//定义栈的初始分配空间
#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章