一、栈的定义
栈是一种特殊的线性结构,这个数据结构具有先进后出的特性,只能在一端进行操作,比如我们日常有时打开网页时,必须先将当前网页关闭才能关闭后面的网页,这就是由栈实现的。
将元素压入栈的操作叫进栈 Push
将元素从栈顶删除的操作叫出栈 Pop

根据图示很容易看出这个数据结构的特性以及如何得到数据,接下来就是具体操作的实现:
二、栈的定义
#include<stdio.h>
#include<stdlib.h>
typedef struct Stack{ //定义栈的结构
int maxsize; //栈的最大规格
int* data; //定义栈中存储数据的形式
int top; //定义栈顶
int lower; //定义栈底
}stack,*Pstack;
int isFull(Pstack stack); //判断栈是否为满了
int isEmpty(Pstack stack); //判断栈是否为空
Pstack createStack(int maxsize); //创建栈
void Push(Pstack stack,int val); //将元素压入栈内
int Pop(Pstack stack); //得到栈的最顶层元素
三、栈基本操作的实现
第一步创建一个栈,顺带的将栈初始化
Pstack createStack(int maxsize){
//因为malloc分配的是地址值所以需要使用指针变量进行接收
Pstack s = (Pstack*)malloc(sizeof(stack));
//为data开辟空间存放数据
s->data = (int*)malloc(sizeof(int)*maxsize);
s->top = maxsize;
s->lower = -1;
s->maxsize=maxsize;
}
实现如何判断栈是否为空或满
int isEmpty(Pstack stack){
return stack->lower==-1;
}
int isFull(Pstack stack){
return stack->lower==stack->top-1;
}
在初始化的时候定义栈顶为最大值,而lower栈底为数组的索引所以在判断的时候需要将top-1
实现为栈添加元素的操作的时候需要判断栈是否为满,如果满了则无法添加需要扩容
void Push(Pstack stack,int val){
if(isFull(stack)){ //如果栈满了
int newMaxSize = stack->maxsize*2; //将栈的最大规格扩大两倍
//使用realloc重新分配内存,将data数组的容量扩大两倍
int *newData = (int*)realloc(stack->data,newMaxSize*sizeof(int));
stack->data = newData; //重新赋值
stack->maxsize = newMaxSize;
}
stack->data[++(stack->lower)]= val;
}
实现删除栈顶数据时则需要判断栈是否为空
int Pop(Pstack stack){
if(stack->lower==-1){
printf("该栈为空,出栈失败");
return 0;
}
int num = stack->data[(stack->lower)--];
return num;
}
这里(stack->lower)--代表先使用stack->lower的值之后再进行减1的操作,这个操作就完成了删除栈顶元素并返回
四、代码实现
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct Stack{ //定义栈的结构
int maxsize; //栈的最大规格
int* data; //定义栈中存储数据的形式
int top; //定义栈顶
int lower; //定义栈底
}stack,*Pstack;
int isFull(Pstack stack); //判断栈是否为满了
int isEmpty(Pstack stack); //判断栈是否为空
Pstack createStack(int maxsize); //创建栈
void Push(Pstack stack,int val); //将元素压入栈内
int Pop(Pstack stack); //得到栈的最顶层元素
int isEmpty(Pstack stack){
return stack->lower==-1;
}
int isFull(Pstack stack){
return stack->lower==stack->top-1;
}
Pstack createStack(int maxsize){
//因为malloc分配的是地址值所以需要使用指针变量进行接收
Pstack s = (Pstack*)malloc(sizeof(stack));
//为data开辟空间存放数据
s->data = (int*)malloc(sizeof(int)*maxsize);
s->top = maxsize;
s->lower = -1;
s->maxsize=maxsize;
}
void Push(Pstack stack,int val){
if(isFull(stack)){ //如果栈满了
int newMaxSize = stack->maxsize*2; //将栈的最大规格扩大两倍
//使用realloc重新分配内存,将data数组的容量扩大两倍
int *newData = (int*)realloc(stack->data,newMaxSize*sizeof(int));
stack->data = newData; //重新赋值
stack->maxsize = newMaxSize;
}
stack->data[++(stack->lower)]= val;
}
int Pop(Pstack stack){
if(stack->lower==-1){
printf("该栈为空,出栈失败");
return 0;
}
int num = stack->data[(stack->lower)--];
return num;
}
void Print(Pstack stack){
for(int i=stack->maxsize-1;i>=0;i--){
printf("%d ",stack->data[i]);
}
}
int main(){
Pstack stack = createStack(5);//创建一个栈
Push(stack,1); //添加栈元素
Push(stack,2);
Push(stack,3);
Push(stack,4);
Push(stack,5);
Push(stack,6);
//把栈当成数组来打印
for(int i=stack->lower;i>=0;i--){
printf("%d ",stack->data[i]);
}
return 0;
}
感谢你能看到这里若代码无法运行,或是代码有误请留言。

6395

被折叠的 条评论
为什么被折叠?



