- 栈的基本介绍
栈是一种先进后出的数据结构,基本的结构图入下,可以把栈理解为一个坑,先丢进坑里的东西被压在更下面,后丢进坑里的东西在更上层,更早被取出。
2.预备知识
malloc函数分配空间返回一个void型指针,指向这个内存空间的头部
指针的运算
a.数组指针(指向数组的指针)实际上指向的是数组中的元素
b.数组名可以认为是指向数组首位的指针
c.定义一个指针p,(p+1)是一个指向p的下一个内存地址的指针
d.定义p,q为两个指针,则p=q,代表将q的指向地址赋给p,本身不会改变p原来指向内存空间存储的值
3.数组栈的结构
typedef struct
{
int* base; //栈底指针
int* top; //栈顶指针
int stacksize; //栈长度
}SqStack;
4.栈的初始化
实际上就是为这个栈分配足够的空间
SqStack* crease() //创建栈并初始化
{
SqStack* L;
L = (SqStack*)malloc(sizeof(SqStack));
L->base = (int*)malloc(sizeof(int) * STACK_INIT_SIZE); //base指向分配的内存的头
L -> top = L->base;
L->stacksize = STACK_INIT_SIZE; //创建一个名为L的栈并初始化
return L;
}
5.对栈进行操作
实际上就是通过控制top(栈顶)指针的移动来完成入栈出栈操作
- 入栈
void insert(SqStack* L,int n) //进栈(向栈中插入n个元素)
{
int x;
cin >> x;
*(L->top) = x;
for (int k = 0; k < n-1; k++)
{
cin>>x;
L->top = (L->top) + 1;
*(L->top) = x;
L->stacksize += 1;
}
}
2.出栈
(这个出栈操作实际上是不好的,没有获取出栈的元素的值)获取值的操作可以看链栈的文章
void out(SqStack* L, int n) //出栈(从栈中去除n个元素)
{
L->top -= n;
}
6.销毁栈
在使用结束后将空间释放出来是一个好习惯
void Destroy(SqStack* L) { //销毁栈
free(L->base); //释放栈存储空间
L->base = L->top = NULL; //栈顶指针栈底指针指向空
L->stacksize = 0; //栈长度归零
}
7.辅助操作
- 栈的长度
int Longstack(SqStack* L) //栈长
{
return (int)(L->top - L->base)+1; //两指针相减等于两指针之间指针指向类型的数量
}
2.打印栈
void Print(SqStack *L) //打印栈中字符
{
int* Run = L->top; //定义一个run指针用于从栈顶向栈底遍历整个栈
while ((Run) != (L->base)) //遍历指针不等于栈底的时候打印字符
{
cout << *(Run) << ',';
Run -= 1;
}
cout << *(Run) << endl; //在上面的判断条件下实际上栈底的那个字符不会被打印
}
8.完整代码合集
#include<iostream>
#include<stdio.h>
using namespace std;
const int STACK_INIT_SIZE = 100;
const int STACKINCREASE = 10;
typedef struct
{
int* base; //栈底指针
int* top; //栈顶指针
int stacksize; //栈长度
}SqStack;
SqStack* crease() //创建栈并初始化
{
SqStack* L;
L = (SqStack*)malloc(sizeof(SqStack));
L->base = (int*)malloc(sizeof(int) * STACK_INIT_SIZE); //base指向分配的内存的头
L -> top = L->base;
L->stacksize = STACK_INIT_SIZE; //创建一个名为L的栈并初始化
return L;
}
void insert(SqStack* L,int n) //进栈(向栈中插入n个元素)
{
int x;
cin >> x;
*(L->top) = x;
for (int k = 0; k < n-1; k++)
{
cin>>x;
L->top = (L->top) + 1;
*(L->top) = x;
L->stacksize += 1;
}
}
int Longstack(SqStack* L) //栈长
{
return (int)(L->top - L->base)+1; //两指针相减等于两指针之间指针指向类型的数量
}
void out(SqStack* L, int n) //出栈(从栈中去除n个元素)
{
L->top -= n;
}
void Print(SqStack *L) //打印栈中字符
{
int* Run = L->top; //定义一个run指针用于从栈顶向栈底遍历整个栈
while ((Run) != (L->base)) //遍历指针不等于栈底的时候打印字符
{
cout << *(Run) << ',';
Run -= 1;
}
cout << *(Run) << endl; //在上面的判断条件下实际上栈底的那个字符不会被打印
}
void Destroy(SqStack* L) { //销毁栈
free(L->base); //释放栈存储空间
L->base = L->top = NULL; //栈顶指针栈底指针指向空
L->stacksize = 0; //栈长度归零
}
int main()
{
int count = 0;
int n = 10;
SqStack* L;
L = crease();
insert(L, n);
Print(L);
count = Longstack(L);
cout << count << endl;
out(L, 4);
Print(L);
Destroy(L); //使用完后记得清空栈
}