作者个人博客 https://www.you3xuan.top/ 查看原文。
源码地址: https://github.com/ThinkingXuan/DataStructure
如果对您有帮助,随手一个Star吧。
1、什么是栈
栈是一个先进后出的线性表,仅允许在栈的一端进行插入和删除操作。栈中允许插入删除的一端叫做栈顶,另一端叫做栈底。元素的删除叫做出栈,元素的插入叫做入栈。栈满时不能入栈,栈空时不能出栈。
栈通过一个栈顶指针来执行各种操作,入栈时栈顶指针上移,出栈时栈顶指针下移。如图所示:
栈的常见操作:
- 创建栈
- 判断是否是空
- 出栈
- 入栈
- 获取栈顶元素
- 销毁栈
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;
}
输出结果: