目前在学数据结构,所以就相当于做笔记了,希望对大家有帮助。
栈大家都很熟悉,这里就不啰嗦了。
在头文件中关于栈和链表的定义,整个的链表是LinkStack, 里面存储的元素top就是节点,这样分开存的好处是方便理解和后期修改
- #include
- #include
- #include
- struct LNode{
- int data; // 栈的数据
- LNode* next; // 指向下一个节点
- };
-
- struct LinkStack{
- LNode* top;
- int len; // 存储栈的长度
- int maxlen; // 栈的最大长度
- };
创建一个栈,值得注意的是len之必须提前赋为-1,保证我们的maxlen数值准确,防止出现最大值是5,但是实际上只能存4个节点的情况
- // 创建一个栈
- LinkStack* Create(int maxlen){
- LinkStack* ls = (LinkStack*)malloc(sizeof(LinkStack));
- ls->top = NULL;
- ls->len = -1;
- ls->maxlen = maxlen;
- return ls;
- }
将栈置空,直接把len修改即可,这里(偷懒)就不free了。
- // 将栈置空
- void FreeAll(LinkStack* ls){
- ls->len = -1;
- }
断栈是否为空
- // 判断栈是否为空
- bool IsEmpty(LinkStack* ls){
- return ls->len <= 0;
- }
判断栈是否已满
- // 判断栈是否已满
- bool IsFull(LinkStack* ls){
- return ls->len == ls->maxlen;
- }
将数据入栈,需要注意一定是头插法,栈只有一个入口
- // 将x压入栈
- bool push(LinkStack* ls, int x){
- if(IsFull(ls)){
- printf("栈已满!");
- return false;
- }
- LNode* newNode = (LNode*)malloc(sizeof(LNode));
- newNode->data = x;
- newNode->next = ls->top;
- ls->top = newNode;
- ls->len++;
- return true;
- }
将栈顶元素出栈,不能提供中间删除的方法,因为栈只有一个出口
- // 将栈顶元素出栈
- bool pop(LinkStack* ls){
- if(IsEmpty(ls)){
- printf("栈为空!");
- return false;
- }
- LNode* tool = ls->top;
- ls->top = tool->next;
- ls->len--;
- return true;
- }
获取栈顶元素,这个方法可以和出栈写在一起,即出栈的时候顺便获取这个元素值
- // 获取栈顶元素
- int getTop(LinkStack* ls){
- return ls->top->data;
- }
打印栈内的所有元素,限于单链表的原因,这里只能反过来打印,即从栈顶打印到栈底。也可以把链表换成双链表
- // 打印栈的所有元素
- void printAll(LinkStack* ls){
- LNode* tool = ls->top;
- while(tool){
- printf("%d ", tool->data);
- tool = tool->next;
- }
- }
最后的主函数,简单测试一下。
- int main(){
- int i = 0, n = 0;
- LinkStack* ls = Create(5);
- while(i < 7){
- scanf("%d", &n);
- if(!push(ls,n)){
- break;
- }
- i++;
- }
- printf("\n");
- pop(ls);
- printAll(ls);
- return 0;
- }
有什么问题可以直接私信我呀~~~~~
希望和诸君共勉