zoukankan      html  css  js  c++  java
  • C语言栈的实现

    公司面试要用C语言实现一个栈,之前做过用一个全局变量的指针来实现的,但是面试官要求在局部定义可以使用。

    当时想的是利用指针的指针,但是没有想清楚为什么,现在总结一下。

    首先参考这篇博客

    https://blog.csdn.net/weixin_36040034/article/details/53351100

    栈的底层可以用数组,可以用链表实现。

    在C语言中,数组定义时必须为固定大小,因此实现栈时有容量限制。所以用栈来实现更为方便。

    首先说数据结构,使用链表的话,需要有数据域,以及指向栈顶下一个元素的指针(最下面为栈底)

    例如

    typedef struct stack

    {

      datatype data;

      struct stack* next;

    }Stack;

    这里需要注意,next前面这里不能用Stack,因为是先定义结构体,再执行typedef,在类型定义之前,编译器还不知道Stack是什么。

    然后再说局部的问题,由于s指向的栈顶元素,因此不可避免的在入栈出栈的时候需要改变堆栈指针s的指向。

    当然,前面说了,定义一个全局变量是很容易实现的,但是在实际工程中,不能定义很多全局变量的情况下,是有缺陷的。

    因此,需要改变指针的指向,就有两种方式,一种是通过返回值返回堆栈指针,一种是通过指针的指针;

    解释一下,为什么改变指针的指向需要指针的指针???

    对于int *s = &a;如果直接在参数传递s,可以更改的是*s的值,但是更改s是不会生效的

    因此,对于pop(s),如果改变了s的指向,对于调用者而言,s的指向并没有变,因此需要用到指针的指针,

    也就是需要传递pop(&s),然后在里面利用*s去更改s的指向

    下面附上用指针的指针实现的几个函数:pop(),push(),top(),init()

    typedef struct stack{
    	int val;
    	struct stack* next;
    }Stack;
    
    void Stack_Init(Stack** s)
    {
    	*s = NULL;
    }
    
    void push(Stack** s, int val)
    {
    	Stack* tmp = (Stack*)malloc(sizeof(Stack) * 1);
    	if (tmp == NULL)
    		return;
    
    	tmp->val = val;
    	tmp->next = (*s);
    	*s = tmp;
    	tmp = NULL;
    }
    
    void pop(Stack** s)
    {
    	Stack* tmp = NULL;
    	if (*s == NULL)
    		return -1;
    	else
    	{
    		tmp = *s;
    		*s = (*s)->next;
    		free(tmp);
    		tmp = NULL;
    	}
    }
    
    int top(Stack* s)
    {
    	if (s == NULL)
    		return -1;
    	else
    		return s->val;
    }
  • 相关阅读:
    codeforces 652B z-sort(思维)
    poj 3268 Silver Cow Party(最短路)
    POJ 2243:Knight Moves(BFS)
    POJ 1107:W's Cipher(模拟)
    POJ 1008 Maya Calendar(模拟)
    Hdu3436-Queue-jumpers(伸展树)
    主席树的另一种写法
    Hdu5785-Interesting(回文串处理)
    Hdu5008-Boring String Problem(后缀数组)
    RMQ模板
  • 原文地址:https://www.cnblogs.com/zhq-blog/p/9608581.html
Copyright © 2011-2022 走看看