简介
栈,线性表的一种特殊的存储结构。与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的。
由于栈只有一边开口存取数据,称开口的那一端为“栈顶”,封死的那一端为“栈底”(类似于盛水的木桶,从哪进去的最后还得从哪出来)。
特点:先进后出
什么是栈?
通俗来讲栈
就好比一个衣物收纳箱,第一个放进去的衣服最后取出(排除不按规则出牌的),只要记住先进后出,又是从同一端进和出的
栈的实现
栈通常分为链式栈和数组栈,下面我用的是链式栈
引入一个节点来存储数据
typedef struct Stack
{
int size; //栈的长度
struct Node * Stack_Top; //指向栈顶节点的指针
}Stack;
//节点
typedef struct Node
{
int data;
struct Node *next;
}Lnode;
创建节点
Lnode* Make_NewNode(int data)
{
Lnode* NewNode = (Lnode *)malloc(sizeof(Lnode));
NewNode->data = data;
NewNode->next = NULL;
return NewNode;
}
注意函数名,别用错结构体
创建一个空栈
Stack* Make_Stack()
{
Stack *S = (Stack *)malloc(sizeof(Stack));
S->size = -1; //此时栈为空
S->Stack_Top = NULL;
return S;
}
进栈-push
void Push(Stack *S,int data)
{
Lnode* NewNode = Make_NewNode(data);
NewNode->next = S->Stack_Top; //新节点指向栈顶的节点
S->Stack_Top = NewNode; //改变栈顶指针
S->size++; //增大栈的长度
}
出栈-pop
void pop(Stack* S)
{
Lnode* tempNode = S->Stack_Top; //tempNode为栈顶节点
if(S->size == -1)
{
printf("栈空\n");
return ;
}
S->Stack_Top = S->Stack_Top->next; //将栈顶指针向下移动
free(tempNode); //释放栈顶节点
S->size--; //减小栈的长度
}
出栈一定要判断一下栈是否为空
判断栈是否为空-IsEmpty
int Isempty(Stack* S)
{
if(S->size == -1)
return 0;
return 1;
}
全部代码
#include "stdio.h"
#include"malloc.h"
typedef struct Stack
{
int size;
struct Node * Stack_Top;
}Stack;
typedef struct Node
{
int data;
struct Node *next;
}Lnode;
//创建节点
Lnode* Make_NewNode(int data)
{
Lnode* NewNode = (Lnode *)malloc(sizeof(Lnode));
NewNode->data = data;
NewNode->next = NULL;
return NewNode;
}
//创建空栈
Stack* Make_Stack()
{
Stack *S = (Stack *)malloc(sizeof(Stack));
S->size = -1;
S->Stack_Top = NULL;
return S;
}
//进栈
void Push(Stack *S,int data)
{
Lnode* NewNode = Make_NewNode(data);
NewNode->next = S->Stack_Top;
S->Stack_Top = NewNode;
S->size++;
}
//取栈顶元素
int Get_StackTop(Stack* S)
{
if(S->size == -1)
{
printf("栈空,取栈顶元素失败\n");
return -1;
}
return S->Stack_Top->data;
}
//出栈
void pop(Stack* S)
{
Lnode* tempNode = S->Stack_Top;
if(S->size == -1)
{
printf("栈空\n");
return ;
}
S->Stack_Top = S->Stack_Top->next;
free(tempNode);
S->size--;
}
//判断栈是否为空
int Isempty(Stack* S)
{
if(S->size == -1)
return 0;
return 1;
}
int main()
{
int a;
//创建空栈
Stack* S = Make_Stack();
Push(S,0);
Push(S,1);
Push(S,2);
Push(S,3);
Push(S,4);
while(Isempty(S))
{
printf("%d->",Get_StackTop(S));
pop(S);
}
printf("NULL\n");
return 0;
}