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;
    }
  • 相关阅读:
    固定表格宽度被TABLE的95%给弄没效果了
    界面只有一个文本框时,回车就会产生页面提交事件
    控件开发读书笔记
    调整window.open窗口大小并且不闪烁
    对showModalDialog窗口的大小调整
    borderwidth的没效果的原因
    “解决方案资源管理器”中不能自动选择正在编辑的文档
    HTML编辑器中不要跳来跳去
    华硕本本Fn+F2不能打开无线
    VS2008打上SP1后,修正javascript智能提示的两个问题
  • 原文地址:https://www.cnblogs.com/zhq-blog/p/9608581.html
Copyright © 2011-2022 走看看