栈满足的特性是先进后出,就像货车装货物,把货物一次放进去,但是卸货的时候,你得先把最外面的卸载了,才能继续卸载里层的货物。
栈的实现有两种形式,一种是数组,一种是链表。
对于一个栈,需要至少三个属性
- top:记录当前栈的顶部,超过栈的长度和长度小于0都应报错。
- push:往栈里面存东西,当超过栈的长度需要警报,当然,链表栈理论上是可以无限存东西的。
- pop:把栈顶部的数据移除。
链表栈
链表栈实际上可以看成链表的一种约束,约束了链表的长度,链表的插入和删除位置。
对于链表栈,需要两个变量
- top:记录当前栈顶的地址和位置。
- 链表:记录当前的数据和下一个,上一个的链表块的地址。
top永远指向了链表栈的最后一个元素,记录其位置。链表栈和链表结构本质相同。
数组栈(顺序栈)
对数组进行约束,成为栈。
数组栈的长度一定,使用top记录当前的位置,比如说,array长度为10,但是我们指存储了5个数据,那么top的值就是4。往栈里面加入一个数据,top变成5,当已经10个数据时,top为9。之后继续加入数据,报错,加入失败。
删除数据时,top减少,当top为0时,继续删除,报错,删除失败。
关于实现一个顺序栈
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
class Stack
{
public:
int top;
int length;
int content[10];
int push(int num);
int pop();
int peek();
Stack();
};
int Stack::peek()
{
return content[top];
};
int Stack::push(int num){{top += 1;
if (top >= 10)
{
top -= 1;
return -1;
}
content[top] = num;
length = top + 1;
return content[top];
}
}
;
int Stack::pop()
{
{
top -= 1;
if (top < 0)
{
top += 1;
return -1;
}
content[top + 1] = -1;
length = top + 1;
return content[top];
};
};
Stack::Stack()
{
top = -1;
length = 0;
};
int main()
{
Stack stack;
for(int i=0;i<7;i++){
stack.push(i*i);
}
for (int i = 0; i < stack.length; i++)
{
printf("%d,", stack.content[i]);
};
printf("\n");
stack.pop();
stack.pop();
for (int i = 0; i < stack.length; i++)
{
printf("%d,", stack.content[i]);
};
return 0;
}
网友评论