C语言数据结构第三章—— 数组实现的顺序栈

数据结构第二章—— 数组实现的顺序栈

get 到的东西:

依然是练手,在数组实现的顺序表内限制了操作,增加了控制变量top

可以用来计算有括号的四则运算(逆波兰法)
多了一个控制入栈和出栈的参数top
应该比较容易,只有数据和top要控制,没有cur也没有next,不用创建结构体

以后确定完参数之后先建立结构体吧,不然工程量大了不好改hhh,好多_(:з」∠)_

实现流程

  1. 栈的操作需要两个量来控制,可以创建一个结构体把它俩包含进去(方便函数引用)
  2. 还有一个记录申请了多少空间的size(设置个全局变量吧)(最后没设,不怎么用得到)
    数组的头地址head和说明数据堆到哪里的最高值top
typedef struct list{
    int *head;
    int top;
}List;
  1. 创建一个动态数组
  • 就是用malloc先申请几个空间,然后把空间的地址赋予给head。
    把head当做栈(Stack)的头地址,也是当做数组使用。
  • 之后就和之前的顺序表一样,进行输入操作。
  • 先让lsit.top+1(多一个数据),往(list.head)[top]里写数据。
  • 如果top要到申请的内存空间size的话,再申请一份Size,然后用size记录现有空间
  • 到输入为1的时候就读取结束。
    • 在函数内应该是list->top和->head,有两种方法操作
    1. 直接一直用list->top操作
    2. List list = *plist,因为一开始在主函数写函数时用的是list,在这里改完之后,再在结尾写下边的代码即可:
plist->head = list.head;
plist->top = list.top;
  1. 其它的函数倒挺简单
    • 入栈就top+1,输入个data。注意下内存空间大小够不够
    • 出栈就top-1。注意下是不是空栈。
    • 输出到屏幕就for循环到printf上就行,啥都不用改。
    • 也插入不了,不然会麻烦点。是静态链表的插入的话,改一下前后数据的cur,再注意下插入的位置是第一个的话,改一下头地址。如果是最后一个的话,只用改前面数据的cur。不在数据范围的话,用i计数,然后说不在范围之内。
    • 删除和插入差不多。

C语言代码——实现部分操作

// 2020/2/14 数组的栈 小试牛刀
#include <stdio.h>
#include <stdlib.h>

#define Size 5

typedef struct list{
    int *head;
    int top;
}List;

void init_stack(List *plist);
void Print(List *plist);
void Pop_data(List *plist);
void Add_data(List *plist);

int main()
{
    List list;
    init_stack(&list);
    Print(&list);
    Pop_data(&list);
    Print(&list);
    Add_data(&list);
    Print(&list);
    return 0;
}

void init_stack(List *plist)
{
    int size = Size;
    int input_data;

    plist->head = (int*)malloc(Size*sizeof(int));
    List list = *plist;
    list.top = -1;

    if( !(list.top<Size) ){ //数据不够了就继续加
        list.head = (int*)realloc(list.head, Size*sizeof(int));
        size += Size;
    }

    do{
        scanf("%d", &input_data);
        if(input_data!=-1){
            list.top++;
            list.head[list.top] = input_data;
        }
    }while(input_data!=-1);
    plist->head = list.head;
    plist->top = list.top;
}

void Print(List *plist)
{
    int i;
    List list = *plist;
    for(i=0; i<=list.top; i++){
        printf("data is rank at %d is %d\n", i, list.head[i]);
    }
}

void Pop_data(List *plist)
{
    List list = *plist;
    printf("data is pop at %d is %d\n", list.top, list.head[list.top]);
    list.top--;
    plist->head = list.head;
    plist->top = list.top;
}

void Add_data(List *plist)
{
    int input_data;
    printf("input the data you want push\n");
    scanf("%d", &input_data);
    (plist->top) ++;
    (plist->head)[plist->top] = input_data;
    printf("data is push at %d is %d\n", plist->top, plist->head[plist->top]);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值