栈的实现1.0数组栈(C/C++)

    • 栈的基本介绍

栈是一种先进后出的数据结构,基本的结构图入下,可以把栈理解为一个坑,先丢进坑里的东西被压在更下面,后丢进坑里的东西在更上层,更早被取出。

2.预备知识

  1. malloc函数分配空间返回一个void型指针,指向这个内存空间的头部

  1. 指针的运算

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);                      //使用完后记得清空栈
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值