数据结构第二章—— 数组实现的顺序栈
get 到的东西:
依然是练手,在数组实现的顺序表内限制了操作,增加了控制变量top
可以用来计算有括号的四则运算(逆波兰法)
多了一个控制入栈和出栈的参数top
应该比较容易,只有数据和top要控制,没有cur也没有next,不用创建结构体
以后确定完参数之后先建立结构体吧,不然工程量大了不好改hhh,好多_(:з」∠)_
实现流程
- 栈的操作需要两个量来控制,可以创建一个结构体把它俩包含进去(方便函数引用)
- 还有一个记录申请了多少空间的size(设置个全局变量吧)(最后没设,不怎么用得到)
数组的头地址head和说明数据堆到哪里的最高值top
typedef struct list{
int *head;
int top;
}List;
- 创建一个动态数组
- 就是用malloc先申请几个空间,然后把空间的地址赋予给head。
把head当做栈(Stack)的头地址,也是当做数组使用。 - 之后就和之前的顺序表一样,进行输入操作。
- 先让lsit.top+1(多一个数据),往(list.head)[top]里写数据。
- 如果top要到申请的内存空间size的话,再申请一份Size,然后用size记录现有空间
- 到输入为1的时候就读取结束。
- 在函数内应该是list->top和->head,有两种方法操作
- 直接一直用list->top操作
- List list = *plist,因为一开始在主函数写函数时用的是list,在这里改完之后,再在结尾写下边的代码即可:
plist->head = list.head;
plist->top = list.top;
- 其它的函数倒挺简单
- 入栈就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]);
}