</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;
}
【算法】棧的C語言實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.