栈的实现及注意事项

栈的特点

1.先入栈的元素会放在栈的底部

2.取出元素的时候,先取出顶部元素

3.栈的大小是有限的,如果栈满了不能放元素,栈空不能取出元素。

栈的实现及注意事项_第1张图片

我们一般用数组加指针组成结构体实现栈。

//由图可知,数组设为
int data[7];
int top;//top意为顶端,用来保持当前栈顶元素的下标
//想要将数据放入栈顶,就对top++,然后对data[top]进行赋值

问题

如何知道现在栈顶元素是哪一个呢?

寻找栈顶top,栈顶元素为data[top]。

当栈是空的时候,栈顶指针应该保持多少?栈满的时候呢?

数组索引一般从0开始,我们存数是先对top++,再赋值。所以当数组下标为0时,0=top+1。则当栈空时,栈顶指针应该保持top=-1。同理,栈满时top+1=7,所以top=6。

代码实现

 首先,导入一个头文件

#include

其次,定义一个结构体用来实现栈

#define MAX_SIZE 100
typedef struct {
	//保存数据的数组
	int data[100];
	//定义保存栈顶元素下标的top指针
	int top;
}Stack;

定义函数对栈进行初始化,核心是对top指针进行初始化,注意top=-1。这里使用Stack*,没有必要将结构体整体都拷贝进去。

void initStack(Stack* stack) {
	//当栈空时,栈顶指针保存-1
	stack->top = -1;
}

弹出栈的元素

//判断栈是否为空
int  isEmpyt(Stack* stack) {
	return stack->top == -1;
}
//弹出栈元素
int pop(Stack* stack) {
	//如果栈空,不能弹出元素,需要提醒栈空
	if (isEmpyt(stack)) {
		printf("栈为空,无法弹出元素\n");
		return 0;
	}
    //也可以这样写
    //return stack->data[stack->top--];
	int val = stack->data[stack->top];
	stack->top--;
	return val;
}

栈内插入元素

//判断栈是否已经满了
int isFull(Stack* stack) {
	return stack->top == MAX_SIZE - 1;
}
//元素插入栈
void push(Stack* stack, int val) {
	//如果栈满了,就不能插入元素了
	if (isFull(stack)) {
		printf("栈满,无法插入元素\n");
		return;
	}
	stack->top++;
	stack->data[stack->top] = val;
}

获取栈元素

//获取栈顶元素的值
int top(Stack* stack) {
	//如果栈空,无法获取
	if (isEmpyt(stack)) {
		printf("栈为空,无法弹出元素\n");
		return 0;
	}
	return stack->data[stack->top];
}

例子: 

int main()
{
	//定义一个栈
	Stack s1;
	initStack(&s1);//初始化,不然就会从0开始
	push(&s1, 10);
	push(&s1, 20);
	push(&s1, 30);
	push(&s1, 40);
	push(&s1, 50);
	int topval;
	for (int i = 0; i < 5; i++) {
		topval = top(&s1);
		printf("%d", topval);
		pop(&s1);
	}
	printf("\n");
	pop(&s1);//检验,没有栈底元素输出
	return 0;
}

你可能感兴趣的:(开发语言,c语言)