漫谈数据结构(三)——栈

图片

作者个人博客 https://www.you3xuan.top/ 查看原文。

源码地址: https://github.com/ThinkingXuan/DataStructure

如果对您有帮助,随手一个Star吧。

1、什么是栈

  栈是一个先进后出的线性表,仅允许在栈的一端进行插入和删除操作。栈中允许插入删除的一端叫做栈顶,另一端叫做栈底。元素的删除叫做出栈,元素的插入叫做入栈。栈满时不能入栈,栈空时不能出栈。

  栈通过一个栈顶指针来执行各种操作,入栈时栈顶指针上移,出栈时栈顶指针下移。如图所示:

栈
  栈的常见操作:

  1. 创建栈
  2. 判断是否是空
  3. 出栈
  4. 入栈
  5. 获取栈顶元素
  6. 销毁栈

2、栈的实现

2.1 顺序表实现

2.1.1 创建栈
typedef struct stack{
	int data[MAXSIZE];   
	int top; 		//栈顶指针 
}SeqStack;

//创建栈 
SeqStack * createSeqStack(){
	SeqStack *stack = (SeqStack *)malloc(sizeof(SeqStack));
	stack->top = -1;
}
2.1.2 判断是否是空
//判断空
int isEmpty(SeqStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	if(stack->top == -1){
		return 1;
	}
	return 0;
}
2.1.3 入栈
//入栈 
int pushStack(SeqStack *stack,int data){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	//判断是否栈满
	if(stack->top == MAXSIZE-1){
		printf("stacl already full!\n");
		return -3;
	} 
	stack->top++;
	stack->data[stack->top] = data;
	return 1;
}
2.1.4 出栈
//出栈 
int popStack(SeqStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	
	if(!isEmpty(stack)){
		 return stack->data[stack->top--];
	}
	return -2;
}
2.1.5 获取栈顶元素
//获取栈顶元素
int getTopStack(SeqStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	
	if(!isEmpty(stack)){
		return stack->data[stack->top];
	}
	
	return -2;
} 
2.1.6 销毁栈
//销毁栈
int destoryStack(SeqStack *stack) {
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	if(!isEmpty(stack)){
		 free(stack);
	}
	return 1;
}

2.1.7 打印
//打印
void print(SeqStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return;
	}
	int i;
	for(i=0;i<=stack->top;i++){
		printf("%d ",stack->data[i]);
	}
	printf("\n");
} 
2.1.8 测试
//顺序表实现栈 
#include<stdio.h>
#include<stdlib.h>
 
#define MAXSIZE 1024
int main(){
	printf("Create Stack:\n"); 
	SeqStack * stack = createSeqStack();
	printf("%d\n\n",stack);
	 
	printf("Push Stack:\n"); 
	int i;
	for(i=0;i<10;i++){
		pushStack(stack,i);
	}
	print(stack);
	printf("\n");
	
	printf("Pop Stack:\n"); 
	popStack(stack);
	print(stack);
	printf("\n");
	
	printf("Get top from stack:\n"); 
	printf("%d\n",getTopStack(stack));
	printf("\n");
	
	printf("Destory stack:\n"); 
	int flag = destoryStack(stack);
	if(flag){
		printf("Destory Success!\n");
	}
	return 0;
} 

输出结果:
输出结果

2.2 单链表实现

  栈的链式存储称为链栈,它和链表的存储方式一样,都可以使用内存中的闲余空间,它用指针来构建结点之间的关系。链栈需要设置一个栈顶指针Top,指向栈顶。链栈是一个单向操作的链表,只能从一端进行操作。

  如图所示:

链栈

2.1.1 创建栈
typedef struct node{
	int data;
	struct node *next;
}Node;

typedef struct stack{
	int size;                //栈大小 
	struct node *top;		//栈顶指针 
}LinkStack;

LinkStack * createLinkStack(){
	LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack));
	if(stack!=NULL){
		stack->top = NULL;
		stack->size = 0;
	}
	return stack; 
}
2.1.2 判断是否是空
//判断空
int isEmpty(LinkStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	
	if(stack->top == NULL || stack->size <=0){
		return 1;
	}
	return 0;
} 
2.1.3 入栈
//入栈 
int pushStack(LinkStack *stack,int data){
	
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}

	Node * node = (Node*)malloc(sizeof(Node));
	node->data = data;
	
	if(!isEmpty(stack)){ //不是空 
		node->next = stack->top;
		stack->top = node;
	}else{ 				//是空 
		stack->top =  node;
	}
	stack->size++;
	return 1;
}

2.1.4 出栈
//出栈 
Node * popStack(LinkStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	
	if(!isEmpty(stack)){
		Node * topNode = stack->top; 
		stack->top = stack->top->next;
		stack->size--;
		return topNode;
	}
	return -2;
}
2.1.5 获取栈顶元素
//获取栈顶元素
Node* getTopStack(LinkStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return -1;
	}
	
	if(!isEmpty(stack)){
		return stack->top;
	}
	
	return -2;
} 
2.1.6 打印
//打印
void print(LinkStack *stack){
	if(stack == NULL){
		printf("not init stack!\n");
		return;
	}
	int i;
	Node * curNode = stack->top;
	
	//curNode指向栈底 
	printf("栈顶<----------栈底\n"); 
	for(i=0;i<stack->size;i++){
		printf("%d ",curNode->data); 
		curNode = curNode->next; 
	}
	
	printf("\n");
} 
2.1.7 测试
//单链表实现栈 
#include<stdio.h>
#include<stdlib.h>
int main(){
	printf("Create Link Stack:\n"); 
	LinkStack * stack = createLinkStack();
	printf("%d\n\n",stack);
	 
	printf("Push Link Stack:\n"); 
	int i;
	for(i=0;i<10;i++){
		pushStack(stack,i);
	}
	print(stack);
	printf("\n");
	
	printf("Pop Stack:\n"); 
	popStack(stack);
	print(stack);
	printf("\n");
	
	printf("Get top from stack:\n"); 
	printf("%d\n",getTopStack(stack)->data);
	printf("\n");
	
	printf("Destory stack:\n"); 
	int flag = destoryStack(stack);
	print(stack);
	if(flag){
		printf("Destory Success!\n");
	}
	return 0;
} 

输出结果:

输出结果

3、栈的应用

3.1 用栈实现四则运算

3.2 栈的递归调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值