初夏小谈:栈的入栈、弹栈操作(完整版)
今天来说说栈的相关操作即:压栈,弹栈。
因为栈就类似于一个子弹夹一样只能从最上面压进去,也只能从最上面弹出来。所以形象的名为:压栈,弹栈,又名入栈,出栈。
由于栈的操作只能在栈顶进行,所以就类似于顺序表/链表的尾插,由于链表的尾插时间复杂度是O(n),而顺序表则是O(1)所以我用顺序表的操作来实现栈的压栈,弹栈操作。
代码如下:
#include"Stack.h"
//初始化
void InitStack(Stack* Sptr)
{
Sptr->capcity = MAX_CAP;
Sptr->ptr = (DataType*)malloc(sizeof(DataType) * Sptr->capcity);
assert(Sptr->ptr);
Sptr->top = 0;
}
//销毁
void DestoryStack(Stack* Sptr)
{
free(Sptr->ptr);
Sptr->ptr = NULL;
Sptr->capcity = 0;
Sptr->top = 0;
}
//扩容
void ExpandStack(Stack* Sptr)
{
if (Sptr->top >= Sptr->capcity)
{
Sptr->capcity = Sptr->capcity * 2;
DataType* Newptr = (DataType*)malloc(sizeof(DataType) * Sptr->capcity);
for (int i = 0; i < Sptr->top; i++)
{
Newptr[i] = Sptr->ptr[i];
}
free(Sptr->ptr);
Sptr->ptr = Newptr;
}
}
//入栈
void AddStack(Stack* Sptr, DataType data)
{
ExpandStack(Sptr);
Sptr->ptr[Sptr->top] = data;
Sptr->top++;
}
//弹栈
void DelStack(Stack* Sptr)
{
Sptr->top--;
}
//打印栈中数据
void PrintStack(Stack* Sptr)
{
for (int i = 0; i < Sptr->top; i++)
{
printf("%d --> ", Sptr->ptr[i]);
}
printf("\n");
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//栈特点:后进先出
//定义数据类型
#define DataType int
//定义动态顺序表型的栈的初始容量
#define MAX_CAP (2)
//定义动态顺序表型的栈
typedef struct StackSeqList
{
DataType* ptr;
int capcity;
int top;
}Stack;
//初始化
void InitStack(Stack* Sptr);
//销毁
void DestoryStack(Stack* Sptr);
//扩容
void ExpandStack(Stack* Sptr);
//入栈
void AddStack(Stack* Sptr, DataType data);
//弹栈
void DelStack(Stack* Sptr);
//打印栈中数据
void PrintStack(Stack* Sptr);
#include"Stack.h"
int main()
{
Stack Sta;
InitStack(&Sta);
//入栈
AddStack(&Sta, 11);
AddStack(&Sta, 22);
AddStack(&Sta, 33);
AddStack(&Sta, 66);
PrintStack(&Sta);
//弹栈
DelStack(&Sta);
PrintStack(&Sta);
DelStack(&Sta);
PrintStack(&Sta);
system("pause");
return 0;
}
如果想查询栈中的元素,就必须进行弹栈操作并进行保存,之后再压回去。
珍&源码