看数据结构写代码(8)顺序栈的实现

欢迎指出 代码 不足之处

在写顺序栈的时候 犯了两个错误,:一个是 对栈的 认识不够清楚,栈顶指针的下一个位置为栈顶元素; 另一个是粗心,在用 realloc 分配内存的时候,忽略了元素本身的大小,只写了 元素的个数。 希望引以为戒。

上代码:

// SqStack.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
#include <cstdio>

//故意将值设置的比较小,以测试 重新分配 存储空间
#define STACK_INIT_SIZE 10
#define STACK_ADD_SIZE	2

typedef int ElementType;

enum E_State
{
	E_State_Error = 0,
	E_State_Ok,
};
//顺序栈
struct sqStack
{
	ElementType * base;
	ElementType * top;
	int stackSize;
};

E_State stackInit(sqStack * stack){
	ElementType * base = (ElementType *)malloc(sizeof(ElementType) * STACK_INIT_SIZE);
	if (base == NULL)
	{
		return E_State_Error;
	}
	stack->base = stack->top = base;
	stack->stackSize = STACK_INIT_SIZE;
	return E_State_Ok;
}


void stackDestory(sqStack * stack){
	free(stack->base);
	stack->base = stack->top = NULL;
	stack->stackSize = 0;
}

void stackClear(sqStack * stack){
	stack->top = stack->base;
}

int stackLen(sqStack stack){
	return stack.top - stack.base;
}

bool stackEmpty(sqStack stack){
	return stack.top == stack.base ? true : false;
}

E_State stackGetTop(sqStack stack,ElementType * e){
	if (stackEmpty(stack))
	{
		return E_State_Error;
	}
	/*e = *stack.top 错误,注意
	没搞清楚 栈顶 指向问题
	// 栈顶指针的下一个位置为栈顶元素
	*/
	*e = *(stack.top-1);
	return E_State_Ok;
}
//
E_State stackPush(sqStack * stack,ElementType e){
	//首先检查空间是否不足.
	int len = stackLen(*stack);
	if (len >= stack->stackSize)
	{
		//粗心啊
		//ElementType * base = (ElementType *)realloc(stack->base,stack->stackSize + STACK_ADD_SIZE);
		ElementType * base = (ElementType *)realloc(stack->base,(stack->stackSize + STACK_ADD_SIZE)*sizeof(ElementType));
		if (base == NULL)
		{
			return E_State_Error;
		}
		stack->base = base;
		stack->top = stack->base + stack->stackSize;
		stack->stackSize += STACK_ADD_SIZE;
	}
	*(stack->top) = e;
	stack->top++;
	return E_State_Ok;
}

E_State stackPop(sqStack * stack,ElementType * e){
	if (stack->top > stack->base)
	{
		stack->top--;
		*e = *stack->top;
		return E_State_Ok;
	}
	else
	{
		return E_State_Error;
	}
}

void stackTraverse(sqStack stack){
	printf("----------------遍历开始----------------------\n");
	if (stack.top > stack.base)
	{
		ElementType * top = --stack.top;
		while (top != stack.base)
		{
			printf("-------%d-----------\n",*top--);
		}
		//最后还要遍历栈底
		printf("-------%d-----------\n",*top);
	}
	printf("----------------遍历结束----------------------\n");
}




int _tmain(int argc, _TCHAR* argv[])
{
	sqStack stack;
	stackInit(&stack);
	//插入 1 ~ 15
	for (int i = 1; i < 16; i++)
	{
		stackPush(&stack,i);
	}
	ElementType top;
	//删除15
	stackPop(&stack,&top);
	//删除14
	stackPop(&stack,&top);
	stackTraverse(stack);
	stackGetTop(stack,&top);
	printf("栈长为:%d,栈顶元素为 :%d,栈是否为空 %d",stackLen(stack),top,stackEmpty(stack));
	stackDestory(&stack);
	return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值