关于栈,原则是先进后出,事实上用了两个迭代器,老实说我自己都不确定,我写的是不是栈
先看一下结构体的定义如下:
typedef struct{
int *top;//指向栈的最后一个元素的下一个
int *bottom;//指向栈的第一个进来的元素
int size_stack;//栈的大小
}Stack;
后面是往这个栈里面添加元素:
Stack stack;
stack.size_stack = 0;
stack.top = malloc(sizeof(int *));//一开始的时候指针是指向一块空的空间的,而空的空间是不允许赋值操作的,需要给他开辟一块空间来进行操作
stack.bottom = stack.top;//让stack.bottom 指向第一个元素我的地址
for(int i = 1;i <= 5;i++){
*stack.top = i;
printf("%d\n",*stack.top);
stack.top = stack.top + 1;//使数据存储在一段连续的地址空间上面,类似于数组
stack.size_stack++;//记录栈里面的数据量的多少
}
printf("size %d\n",stack.size_stack);
printf("%d,%d\n",*(stack.bottom ),*(stack.top - 1));
关于栈元素的插入:
我的设想是这样的,将要插入的元素值放入stack.top指向的空间,然后使stack.top的上一个与stack.top的“值进行交换”
然后就是一直这样轮着交换,一直到指定的位置,交换结束后,使stack.top指向它的下一处的地址空间
关于栈元素的删除:
这个我还真有点迷,栈和链表是不一样的,链表是通过指针的指向来使各个节点相关联,如果要删除这个个节点其实只要让上一个节点不指向他
指向它的下一个结点就好了
但栈是地址的连续性来存放一串数据的,如果我要删除一个节点肯定不能说把中间那个地址给它挖掉,只能是通过值的交换来达到一种看似删除的效果
一般栈和队列里面的结构体都定义了这个栈或者队列的大小,所以我们在打印整个栈和队列的时候,它的范围是要依据它所给定的大小的,不能多打印了,都打印的地方那块地址空间可能是一个空值,也可能是任意的其它任何的一个值,具有很大的不确定性