顺序栈-代码

《数据结构与算法的问题与实验》例子


#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char ElemType;

typedef struct SNode
{
	ElemType *top;   //栈顶指针 
 	ElemType *bottom;//栈底指针
 	int stackSize;   //顺序栈的最大长度 
}Stack;
 
 //初始化栈 
 void InitStack(Stack *s)
 {
 	s->bottom = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
 	if(s->bottom==NULL)
 	{
   		printf("初始化栈时,申请空间失败。");
   		return;
	}
	s->top = s->bottom;
	s->stackSize = STACK_INIT_SIZE;  
 }
 
 //清空栈 
 void ClearStack(Stack *s)
 {
	free(s->top);
	free(s->bottom);
 }
//判断栈是否为空,栈为空的话返回1;栈不空的话返回0; 
int EmptyStack(Stack* s)
{
	if(s->top == s->bottom)
 	{
  		//printf("经过EmptyStack函数判定,本栈为空。\n");
  		return 1;
 	}
 	return 0;
}
 
 //入栈
 void Push(Stack* s,ElemType e)
 {
 	//如果栈满,追加空间。 
	if(s->top - s->bottom == s->stackSize)
  	{
   		s->bottom = (ElemType *)realloc(s->bottom,sizeof(ElemType)*(s->stackSize + STACKINCREMENT));
		//如果追加空间失败 
		if(s->bottom==NULL)
		{
    		printf("栈满时,追加空间失败。");
    		return;
   		}
   		//重新为栈顶指针赋值 
  		s->top = s->bottom + s->stackSize;
  		//重新为栈的最大长度赋值 
  		s->stackSize += STACKINCREMENT;
  }
  //取地址符 
  //先为栈顶元素赋值,再为栈顶指针加1. 
  *s->top = e;
  s->top++;
 }

 //出栈
 ElemType Pop(Stack* s)
{
 	if(EmptyStack(s)==1)
 	{
  		printf("栈空");
  		return 0;
 	}
 	ElemType data;
 	//因为入栈时是先入栈后++,所以出栈时先--再取元素; 
 	s->top--;
 	data =  *s->top;
 	return data;
}

//取栈顶元素
ElemType Top(Stack* s)
{
	ElemType data;
 	if(s->top == s->bottom)
 	{
  		printf("在取栈顶元素的时候,发现栈为空");
  		return 0;
 	}
 	data =  *(s->top-1);
 	return data;
}

//栈的长度 
int StackLength(Stack* s)
{
	return s->top - s->bottom;
}

void Output(Stack* s)
{
 	ElemType *temp = s->top;
 	if(EmptyStack(s)==0)
		return; 
 	do
 	{
  		temp--;
  		printf("%c",*temp);
 	}
 	while(temp > s->bottom);
}
int main()
{
	ElemType ch,temp;
	Stack* s;
	s = (Stack *)malloc(sizeof(Stack));	
	printf("1-初始化栈\n");
	InitStack(s);
	printf("2-栈为:%s\n",(EmptyStack(s)?"空":"非空"));
	printf("3-依次将'j','a','k','e'入栈\n");
	Push(s,'j');
	Push(s,'a');
	Push(s,'k');
	Push(s,'e');
	printf("4-栈为:%s\n",(EmptyStack(s)?"空":"非空"));
	printf("5-栈的长度为:%d\n",StackLength(s));
	printf("6-取栈顶元素:");
	ch = Top(s);
	printf("e=%c\n",ch);
	printf("7-从栈顶到栈底输出元素\n");
	Output(s);
	
	printf("\n");
	printf("8-所有元素出栈\n");
	while(!EmptyStack(s))
	{
		ch = Pop(s);
	}	
	
	printf("9-栈为:%s\n",(EmptyStack(s)?"空":"非空"));
	printf("10-释放栈\n");
	ClearStack(s);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值