【算法】棧的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;
}


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