算法通关村第四关青铜挑战——如何基于数组实现栈

本篇我们就讨论一个问题:如何用数组实现栈?

1.构建结构体

struct Stack {
	int* items;
	int top;
	int capacity;
};

其中items指向数组的指针,top代表的是栈顶元素的索引,capacity用于记录数组初始化的大小,到时候可以用于判断栈是否满了。

2.初始化栈

Stack* create_stack(int capacity) {
//创建一个栈
	Stack* stack = new Stack();
	stack->items = new int[capacity];
	stack->top = -1;
	stack->capacity = capacity;
	return stack;
}

stack->items = new int[capacity];的意思是根据你穿来的大小capacity创建一个capacity大小的数组,把数组的首地址保存在stack本身的items的指针上,方便以后访问。这个方法返回一个指向栈的指针,可以通过指针来访问栈。

3.判断栈是否为空

bool is_empty01(Stack* stack) {
	return stack->top == -1;
}

注意:vs中这里不能命名为is_empty好像是系统内置了一个is_empty。

4.判断栈是否为满

bool is_full(Stack* stack) {
	return stack->top == stack->capacity - 1;
}

5.入栈

void push(Stack* stack, int item) {
	if (is_full(stack)) {
		cout << "栈已经满了" << endl;
		return;
	}
	stack->items[++stack->top] = item;
}

stack->top表示栈顶元素的索引。
++stack->top会先将stack->top的值加1,然后返回增加后的值。也就是说,这行代码将栈顶索引自增,使其指向新的空闲位置。stack->items是一个指向整型数组的指针,表示存储栈元素的数组。stack->items[++stack->top]表示通过栈顶索引找到下一个空闲位置,然后将其赋值为item

6.出栈

int pop(Stack* stack) {
	if (is_empty01(stack)) {
		cout << "这个栈已经空了" << endl;
		return 0;
	}
	return stack->items[stack->top--];
}

根据stack->top返回数组中的元素,然后stack->top--,栈顶元素改变。

7.返回栈顶元素

int peek(Stack* stack) {
	if (is_empty01(stack)) {
		cout << "这个栈已经空了" << endl;
		return 0;
	}
	return stack->items[stack->top];
}

返回顶部元素,但是不会取出来,只是看看,栈顶元素不会变。

8.返回栈的大小

int size01(Stack* stack) {
	return stack->top+1;
}

这里在vs中同样不能定义size,似乎是因为系统内置了一个同名的。

9.测试用例

int main() {
	//创建一个容量为100的栈
	Stack* stack = create_stack(100);

	//入栈
	push(stack, 1);
	push(stack, 2);
	push(stack, 3);
	//返回栈顶元素
	int a = peek(stack);
	cout << a << endl;
	//出栈
	pop(stack);
	int size = size01(stack);
	cout << size << endl;
}

最后输出两个数字:3,2。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值