一、什么是栈
栈是线性结构的常见应用之一,其中只要能够实现“先进后出”的存储结构就称为栈
二、分类
- 静态栈:核心是数组
- 动态栈:核心是链表
三、算法
- 入栈
- 出栈
1、初始化栈表
void init(PST s){
PNODE st=(PNODE)malloc(sizeof(PNODE));
if(st == NULL){
printf("初始化失败\n");
exit(-1);
}
else{
s->ptop=st;
s->pbottom=st;
}
}
2、入栈
void push(PST s,int val){
PNODE st=(PNODE)malloc(sizeof(PNODE));
if(st==NULL){
printf("初始化失败\n");
exit(-1);
}
else{
st->data=val;
st->pNext=s->ptop;
s->ptop=st;
}
}
3、出栈
bool pop(PST s,int *val){
if(!is_empty(s)){
PNODE q=s->ptop;
s->ptop=q->pNext;
*val=q->data;
free(q);
q=NULL;
return true;
}
return false;
}
4、遍历栈
void traverse(PST s){
PNODE p=s->ptop;
while(p!=s->pbottom)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
}
5、判空
bool is_empty(PST s){
if(s->ptop==s->pbottom)
return true;
else
return false;
}
6、清空栈
void clear(PST s){
if(!is_empty(s)){
PNODE p=s->ptop;
PNODE q=NULL;
while(p!=s->pbottom){
q=p->pNext;
free(p);
p=q;
}
s->ptop=s->pbottom;
}
}
完整代码
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node{
struct Node *pNext;
int data;
}NODE,*PNODE;
typedef struct Stack{
PNODE ptop;
PNODE pbottom;
}ST,*PST;
void init(PST s){
PNODE st=(PNODE)malloc(sizeof(PNODE));
if(st == NULL){
printf("初始化失败\n");
exit(-1);
}
else{
s->ptop=st;
s->pbottom=st;
}
}
void push(PST s,int val){
PNODE st=(PNODE)malloc(sizeof(PNODE));
if(st==NULL){
printf("初始化失败\n");
exit(-1);
}
else{
st->data=val;
st->pNext=s->ptop;
s->ptop=st;
}
}
void traverse(PST s){
PNODE p=s->ptop;
while(p!=s->pbottom)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
}
bool is_empty(PST s){
if(s->ptop==s->pbottom)
return true;
else
return false;
}
bool pop(PST s,int *val){
if(!is_empty(s)){
PNODE q=s->ptop;
s->ptop=q->pNext;
*val=q->data;
free(q);
q=NULL;
return true;
}
return false;
}
void clear(PST s){
if(!is_empty(s)){
PNODE p=s->ptop;
PNODE q=NULL;
while(p!=s->pbottom){
q=p->pNext;
free(p);
p=q;
}
s->ptop=s->pbottom;
}
}
int main(){
ST s;
int val;
init(&s);
push(&s,1);
push(&s,2);
push(&s,3);
push(&s,4);
traverse(&s);
if(pop(&s,&val)){
printf("删除的元素是%d\n",val);
}
else{
printf("删除失败\n");
}
traverse(&s);
clear(&s);
traverse(&s);
return 0;
}