数据结构之栈

栈的概念:

栈,仅限定为表尾进行插入或删除操作的线性表。

栈顶——top

栈底——bottom


特性:

后进先出(last in first out)


用C/C++实现栈的算法:

#include <malloc.h>

#define STACK_INIT_SIZE	100
#define STACK_INCREMENT	10

#ifndef SElemType
typedef	int	SElemType;
#endif

typedef struct{
	SElemType *base;//栈底
	SElemType *top;//栈顶
	int stacksize;//栈的当前可使用的最大容量
}SqStack;

//构造一个空栈
int InitStack(SqStack &stack);

//销毁栈
int DestroyStack(SqStack &stack);

int GetTop(SqStack &stack,SElemType &data);

int Push(SqStack &stack,SElemType data);

int Pop(SqStack &stack,SElemType &data);

//插入data为栈顶元素
int Push(SqStack &stack,SElemType data);


int InitStack(SqStack &stack)
{
	stack.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!stack.base)return 0;
	stack.top = stack.base;
	stack.stacksize = STACK_INIT_SIZE;
	return 1;
}

int DestroyStack(SqStack &stack)
{
	if(stack.top == stack.base)return 1;
	free(stack.base);
	stack.base = stack.top = NULL;
}

int GetTop(SqStack &stack,SElemType &data)
{
	if(stack.top == stack.base)return 0;
	data = *(stack.top - 1);
	return 1;
}

int Push(SqStack &stack,SElemType data)
{
	if((stack.top-stack.base) >= stack.stacksize)//满栈,添加存储空间
	{
		/*realloc 内存扩大,并拷贝源内存数据*/
		stack.base = (SElemType *)realloc(stack.base,(stack.stacksize+STACK_INCREMENT)*sizeof(SElemType));
		if(!stack.base)return 0;
		stack.top = stack.base + stack.stacksize;
		stack.stacksize += STACK_INCREMENT;
	}
	*stack.top++ = data;
	return 1;
}

int Pop(SqStack &stack,SElemType &data)
{
	if(stack.top == stack.base)return 0;
	data = *(--stack.top);
	return 1;
}

int IsEmpty(SqStack &stack)
{
    if(stack.top != stack.base)return 0;
    return 1;
}

栈的应用:

  • 数值转换
    输入任意一个非负10进制整数,打印输出其对应的8进制整数:
    //数制转换——将10进制转成8进制
    void ConversionToO()
    {
    	SqStack stack;
    	int d;
    	InitStack(stack);
    	scanf("%d",&d);
    	while(d)
    	{
    		Push(stack,d%8);
    		d /= 8;
    	}
    	while(!IsEmpty(stack))
    	{
    		Pop(stack,d);
    		printf("%d",d);
    	}
    	printf("\r\n");
    }
  • 行编辑器程序


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值