数据结构学习~08.顺序栈和链栈

数据结构学习~08.顺序栈和链栈

本文是上一篇文章的后续,详情点击该链接~

顺序栈

顺序栈的状态

栈空状态

       stack.top = -1。

栈满状态

       stack.top == MAXSIZE - 1。MAXSIZE作为栈中最大元素的个数,则 MAXSIZE - 1 为栈满时栈顶元素在数组中的位置,因为数组的下标从 0 号开始。

顺序栈代码实现

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100
//顺序栈的定义
typedef struct {
	int data[MAXSIZE];		//存放栈中元素,MAXSIZE是已经定义的常量
	int top;				//栈顶指针
}SqStack;					//顺序栈结点定义

//初始化栈
void initStack(SqStack &stack) {	
	stack.top = -1;		//初始化一个栈,只需将栈顶指针置为 -1 即可
}

//判断栈空
int isEmpty(SqStack stack) {
	return stack.top == -1 ? 1 : 0;
}

//进栈
int push(SqStack &stack, int x) {
	//如果栈满了,则不能进栈
	if (stack.top == MAXSIZE - 1) {
		return 0;
	}
	//先移动指针,再进栈
	++(stack.top);
	stack.data[stack.top] = x;
	return 1;
}

//出栈
int pop(SqStack &stack) {
	//用来保存被删除的元素
	int x = 0;
	//如果栈空则不能出栈
	if (stack.top == -1) {
		return 0;
	}
	//先取出元素,再移动指针
	x = stack.data[stack.top];
	--(stack.top);
	//返回被删除的元素
	return x;
}

//遍历
void Print(SqStack stack) {
	int i;
	for (i = 0; i < stack.top; i++) {
		printf("%d ",stack.data[i]);
	}
	printf("\n");
}

int main(int argc,char*argv[]) {
	//创建一个栈
	SqStack stack;
	int i = 1,x = 0;
	//初始化
	initStack(stack);
	//添加 1 ~ 9
	for (i = 1; i < 11; i++) {
		push(stack,i);
	}
	//遍历
	printf("删除前:  "); Print(stack);
	//删除
	x = pop(stack);
	printf("删除后: "); Print(stack);
	return 0;
}

链栈

链栈的状态

栈空状态

       stack->next == NULL

       链栈基本上不存在栈满状态~前提是没有人抬杠

#include<stdio.h>
#include<stdlib.h>
//链栈结点定义
typedef struct StackNode {
	int data;					//数据域
	struct StackNode* next;			//指针域
}StackNode;

//链栈的初始化代码
//stack要改变,所以用引用型
void initStack(StackNode *&stack) {
	//制造一个头节点
	stack = (StackNode*)malloc(sizeof(StackNode));
	stack->next = NULL;
}

//判断栈空代码
int isEmpty(StackNode *stack) {
	return stack->next == NULL ? 1 : 0;
}

//进栈代码
void push(StackNode *stack, int x) {
	//进栈元素的申请结点空间
	StackNode* p = (StackNode*)malloc(sizeof(StackNode));
	p->next = NULL;
	//链栈的头插法
	p->data = x;
	p->next = stack->next;
	stack->next = p;
}

//出栈
int pop(StackNode *stack) {
	StackNode* p;
	//用来保存被删除的值
	int x = 0;
	//栈空则不能出栈
	if (stack->next == NULL) {
		return 0;
	}
	//删除操作,和单链表的思想一模一样
	p = stack->next;
	x = p->data;		//保存被删除的值
	stack->next = p->next;
	free(p);
	return x;
}

//遍历
void Print(StackNode *stack) {
	StackNode* temp = stack->next;
	//判断是否为空
	if (isEmpty == 0) {
		printf("[ ]");
		return;
	}
	//遍历
	while (temp != NULL) {
		//判断是否到了最后一个
		if (temp ->next != NULL) {
			printf("%d -> ",temp->data);
		}
		else {
			printf("%d",temp->data);
		}
		temp = temp->next;
	}
	printf("\n");
}

int main(int argc, char* argv[]) {
	//创建一个栈
	StackNode* stack = (StackNode*)malloc(sizeof (StackNode));
	int i = 0,x = 0;
	//初始化栈
	initStack(stack);
	//插入十九个元素
	for (i = 1; i < 20; i++) {
		push(stack,i);
	}
	//遍历
	printf("删除前: "); Print(stack);
	//删除
	x = pop(stack);
	printf("删除后: "); Print(stack);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41424688/article/details/107631321