C语言printf的入栈,C语言实现栈的基本操作

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值