精华内容
下载资源
问答
  • 怎么获取c++标准库中的栈的栈顶指针?? S.top()获取的是元素而不是指针啊变为*(S.top())又显示为非法访问 要怎么办呢??在此请教大家~
  • /*栈的动态分配顺序存储初始化,且top指针指向栈顶元素 */ Status InitStack(SqStack *S) { S->base=(Elemtype*)malloc(sizeof(Elemtype)*INIT_SIZE); if(!S->base) { return ERROR; } S->top = S->base-1; ...

    top为指针且指针指向栈顶元素
    在这里插入图片描述
    一、栈的动态分配顺序存储的结构定义:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    
    #define ERROR 0
    #define OK    1
    
    #define INIT_SIZE  10      /*栈的初始分配容量*/ 
    #define INCREMENT   2      /*栈的分配量增量*/ 
    
    typedef int  Status;
    typedef int  Elemtype;
    typedef struct SqStack{
    	Elemtype *base;       //栈底指针,始终指向栈底的位置 
    	Elemtype *top;        //栈定指针,可以指向栈顶元素下一个位置或栈顶元素 
    	int StackSize;        //栈的初始可使用分配存储量 
    }SqStack;
    

    二、栈的初始化:

    /*栈的动态分配顺序存储初始化,且top指针指向栈顶元素 */
    Status InitStack(SqStack *S)
    {
    	S->base=(Elemtype*)malloc(sizeof(Elemtype)*INIT_SIZE);
    	if(!S->base)
    	{
    		return ERROR;
    	}
    	S->top = S->base-1;            
    	S->StackSize=INIT_SIZE;
    	return OK;
    }
    

    三、入栈(压栈)操作:

    /*压栈操作*/ 
    void PushStack(SqStack *S,Elemtype e)
    {
    	
    	if( S->top - S->base + 1 >= S->StackSize )
    	{   /*栈满,追加空间*/
    		S->base=(Elemtype*)realloc(S->base,(S->StackSize+INCREMENT)*sizeof(Elemtype));
    	    assert(S->base != NULL);                //判断是否扩容成功 
    		S->top = S->base + S->StackSize -1;    //修改栈顶指针 
    		S->StackSize=S->StackSize+INCREMENT;   //扩容后栈的存储容量 
    	}
    	
    	*++S->top=e;                               //将e入栈 
    } 
    

    四、栈的当前长度:

    /*栈的当前长度*/
    Status StackLength(SqStack *S)
    {
    	if( S->top >= S->base -1 )
    	{
    		return S->top - S->base +1;
    	} 
    	else return ERROR;
    }
    

    五、获取栈顶元素:

    /*取栈顶元素*/
    Status GetTop(SqStack *S,Elemtype *e)
    {
    	if(S->top > S->base -1 )
    	{
    		*e = *S->top;
    		return OK;
    	}
    	else return ERROR;
    } 
    

    六、判断栈是否为空栈:

    /*判断一个栈是否为空*/
    Status StackEmpty(SqStack *S)
    {
    	if( S->top == S->base - 1 ) return ERROR;
    	else return OK;
    } 
    
    

    七、清空栈:

    /*清空栈*/
    void ClearStack(SqStack *S)
    {
    	S->top = S->base-1;
    } 
    

    八、销毁栈:

    /*销毁栈*/
    void DestroyStack(SqStack *S)
    {
    	if(S != NULL)
    	{
    		free(S->base);
    		S->base = S->top=NULL;
    		S->StackSize=0;
    	}
    }
    

    九、出栈(弹栈)操作:

    /*弹栈操作*/
    Status PopStack(SqStack *S,Elemtype *e)
    {
    	if(S->top == S->base -1)    //判断是否栈空 
    	{
    		return ERROR;
    	}
    	*e = *S->top--;
    	return OK;
    }
    

    十、遍历栈:

    /*遍历栈*/ 
    void StackTraverse(SqStack S,void (*visit)(Elemtype))
    {
    	while(StackEmpty(&S))
    	{
    		visit(*S.base++);
    	}
    }
    void Print(Elemtype e)
    {
    	printf("%d ",e);
    }
    

    十一、主函数:

    int main()
    {
    	int i,value,length;
    	Elemtype e;
    	SqStack S;
    	
    	value=InitStack(&S);
    	if(value)
    	{
    		printf("初始化栈成功!\n\n");
    	}
    	else  
    	{
    		puts("error!");
    		return ERROR;
    	}
    	
    	for(i=1;i<12;i++)
    	PushStack(&S,i);
    	printf("栈中的元素为:\n");
    	StackTraverse(S,Print);
    	
    	value=StackEmpty(&S);
    	if(value)
    	{
    		printf("\n非空栈!\n");
    	}
    	else
    	{
    		printf("空栈!");
    	} 
    	length=StackLength(&S);
    	printf("当前长度为:%d\n",length);
    	
    	value=PopStack(&S,&e);
    	if(value)
    	{
    		printf("\n弹出的栈顶元素为:%d\n",e);
    	}
    	else
    	{
    		printf("空栈!\n");
    		return ERROR;
    	}	
    		
    	value=GetTop(&S,&e);
    	if(value)
    	{
    		printf("当前栈顶元素为:%d\n当前栈长度为:%d\n",e,StackLength(&S));
    	} 
    	else
    	{
    		printf("error! Stack Empty\n");
    		return ERROR;
    	} 
    	
    	ClearStack(&S);
    	printf("\n\n清空栈后:\n");
    	value=StackEmpty(&S);
    	if(value)
    	{
    		printf("\n非空栈!");
    	}
    	else
    	{
    		printf("空栈!\n");
    	} 
    	length=StackLength(&S);
    	printf("当前长度为:%d\n",length);
    	
    	DestroyStack(&S);
    	printf("\n销毁栈后:\n top=%u,base=%u,StackSize=%d",S.top,S.base,S.StackSize);
    	
    	return 0;
    } 
    

    十二、运行截图:
    在这里插入图片描述

    展开全文
  • 理解静态栈中的top指针 对于顺序静态栈定义代码: typedef struct Stack { int s[10]; int top; } stack; 在C语言数据结构教材中常提到 : top指针,但是在top指针里面存放的是一个整型数据,需要注意的是,此指针而...

    理解静态栈中的top指针

    对于顺序静态栈定义代码:

    typedef struct Stack
    {
    int s[10];
    int top;
    } stack;

    在C语言数据结构教材中常提到 : top指针,但是在top指针里面存放的是一个整型数据,需要注意的是,此指针而非C语言里面的指针,C语言中的指针是存放的指向下一个数据元素的地址。

    在栈式存储中,定义的结构体类型在内存中的分配是这样的:
    在这里插入图片描述
    如上图的内存分配:top是一个整型的变量,里面存放的是整型值,而非地址,但是为什么在数据结构中还是叫它top指针呢?
    首先先来思考一个问题:栈是怎么一步步的向里面存放数据的的呢?在顺序静态栈中的定义上,提前固定了数组的大小, 初始的时候,我们先要使数组的角标为 0,然后向S[ 0 ]进行赋值,之后再使数组的角标加 1,然后向 S[ 1 ]输入数据,依次如此向下进行。直到输入至角标为 9 时,此时为S[ 9 ],栈满。
    说了这么多有啥用呢。。你品,你细品;难道top不就是像极了角标吗?
    在栈的初始化中代码描述不是这样的吗:

    void Initiazation (stack &S)
    {
    S.top=0;
    }
    我们对栈中的 top 变量进行了初始化,每当我们向栈中第一次添加数据时,只需要使用 数组名[ S.top ]=添加的数据,也就是S. s[ S.top ]=数据,然后再使 S.top++;如此就可以依次向下继续添加数据,直到栈满;
    在内存中top的变化是这样的:

    在这里插入图片描述

    但是呢,可以这么理解top: top=0时,对应的数组角标为0;也就可以理解为:top=0时指向角标为0的数组,如果向栈中添加数据,只需要向角标为top值的数组添加数据即可;换言之:top就是能够使数组依次添加数据的中间量,每一次添加数据,都使用top值作为数组的角标,进行数据的添加,所以top值对应着为相同角标的数组位置,故而有着top指针的称谓。

    再来看一下压栈代码:

      void PushStack (stack &S,int e)
       { 
             S.s[S.top]=e;  //先向top所指向的数组进行赋值,值为e;
             S.top++;       //再使top值加1,使其指向下一个数组位置
       }
    

    所以这样的解释,应该很好理解“为什么栈中的top是整型数值,但还是把它叫做指针了吧。。。”

    展开全文
  • 栈是先进后出的结构体,栈顶指针有两种情况 1,栈顶指针指向的是空的位置 2.栈顶指针指向栈顶的数据 第一种情况:当栈顶指针指向的是一个空位置。当栈不为空的时候 想出栈时候,系统得知道哪个数据出栈,此时指向...

    栈是先进后出的结构体,栈顶指针有两种情况 1,栈顶指针指向的是空的位置 2.栈顶指针指向栈顶的数据

    第一种情况:当栈顶指针指向的是一个空位置。当栈不为空的时候 想出栈时候,系统得知道哪个数据出栈,此时指向栈顶的指针需要向下移动一个单元告诉系统即将出栈的数据的位置。 当数据需要进栈时候,系统需要知道数据放在哪个位置,此时指针指向的是一个空单元,所以数据先入栈,然后指针再移动。

    第二种情况:当栈顶指针指向的是一个实际数据。当栈不为空时,当数据想出栈,此时指针指向的正好是即将出栈的数据,指针告诉了系统这个数据的位置,因此先将数据出栈,然后移动指针。 当数据想进栈时候,系统需要知道数据放的位置。此时指针指向的位置已经有数据了,因此需要先移动告诉系统数据放的位置然后数据再入栈

    指针不论指向空位置还是指向一个非空的存放实际数据的位置,指针的移动核心都是让系统知道从哪个位置取数据,或者在哪个位置放数据。

    展开全文
  • top指针且指向栈顶元素下一个位置 一、栈的动态分配顺序存储结构定义: #include #include #define ERROR 0 #define OK 1 #define INIT_SIZE 10 /*栈的初始分配容量*/ #define INCREMENT 2 /*栈的分配量...

    top为指针且指向栈顶元素下一个位置
    在这里插入图片描述
    一、栈的动态分配顺序存储结构定义:

    #include<stdio.h>
    #include<stdlib.h>
    
    #define ERROR 0
    #define OK    1
    
    #define INIT_SIZE  10      /*栈的初始分配容量*/ 
    #define INCREMENT   2      /*栈的分配量增量*/ 
    
    typedef int  Status;
    typedef int  Elemtype;
    typedef struct SqStack{
    	Elemtype *base;       //栈底指针,始终指向栈底的位置 
    	Elemtype *top;        //栈顶指针,可以指向栈顶元素下一个位置或栈顶元素 
    	int StackSize;        //栈的初始可使用分配存储量 
    }SqStack;
    

    二、栈的初始化:

    /*栈的动态分配顺序存储初始化,且栈顶指针且指向下一个栈顶元素 */
    Status InitStack(SqStack *S)
    {
    	S->base=(Elemtype*)malloc(sizeof(Elemtype)*INIT_SIZE);
    	if(!S->base)
    	{
    		return ERROR;
    	}
    	S->top=S->base;            
    	S->StackSize=INIT_SIZE;
    	return OK;
    }
    

    三、入栈(压栈)操作:

    /*压栈操作*/ 
    Status PushStack(SqStack *S,Elemtype e)
    {
    	
    	if( S->top - S->base >= S->StackSize )
    	{   /*栈满,追加空间*/
    		S->base=(Elemtype*)realloc(S->base,(S->StackSize+INCREMENT)*sizeof(Elemtype));
    		if(!S->base)                           //扩容失败 
    		{
    			return ERROR;
    		}
    		S->top=S->StackSize+S->base;           //修改栈顶指针 
    		S->StackSize=S->StackSize+INCREMENT;   //扩容后栈的存储容量 
    	}
    	*(S->top)=e;                               //将e入栈 
    	S->top++;                                  //入栈后栈顶指针指向下一个栈顶元素的地址 
    	return OK;
    } 
    

    四、栈的当前长度:

    /*栈的当前长度*/
    Status StackLength(SqStack *S)
    {
    	if(S->base != NULL && S->top != NULL )
    	{
    		return S->top - S->base;
    	} 
    	else return ERROR;
    }
    

    五、取栈顶元素:

    /*取栈顶元素*/
    Status GetTop(SqStack *S,Elemtype *e)
    {
    	if(S->top > S->base)
    	{
    		*e = *(S->top-1);
    		return OK;
    	}
    	else return ERROR;
    } 
    

    六、判断一个栈是否为空:

    /*判断一个栈是否为空*/
    Status StackEmpty(SqStack *S)
    {
    	if(S->base==S->top) return ERROR;
    	else return OK;
    } 
    

    七、清空栈:

    /*清空栈*/
    void ClearStack(SqStack *S)
    {
    	S->top=S->base;
    } 
    

    八、销毁栈:

    /*销毁栈*/
    void DestroyStack(SqStack *S)
    {
    	if(S != NULL)
    	{
    		free(S->base);
    		S->top=S->base=NULL;
    		S->StackSize=0;
    	}
    }
    

    九、出栈(弹栈)操作:

    /*弹栈操作*/
    Status PopStack(SqStack *S,Elemtype *e)
    {
    	if(S->top == S->base)    //判断是否栈空 
    	{
    		return ERROR;
    	}
    	*e = *--S->top;
    	return OK;
    }
    

    十、遍历栈:

    /*遍历栈*/ 
    void StackTraverse(SqStack S,void (*visit)(Elemtype))
    {
    	while(StackEmpty(&S))
    	{
    		visit(*S.base++);
    	}
    }
    void Print(Elemtype e)
    {
    	printf("%d ",e);
    }
    

    十一、主函数:

    int main()
    {
    	int i,value,length;
    	Elemtype e;
    	SqStack S;
    	
    	value=InitStack(&S);
    	if(value)
    	{
    		printf("初始化栈成功!\n\n");
    	}
    	else  
    	{
    		puts("error!");
    		return ERROR;
    	}
    	
    	for(i=1;i<10;i++)
    	PushStack(&S,i);
    	printf("栈中的元素为:\n");
    	StackTraverse(S,Print);
    	
    	value=StackEmpty(&S);
    	if(value)printf("\n非空栈!");
    	else printf("空栈!");
    	length=StackLength(&S);
    	printf("当前长度为:%d\n",length);
    	
    	PopStack(&S,&e);
    	printf("\n弹出的栈顶元素为:%d\n",e);
    	GetTop(&S,&e);
    	printf("新的栈顶元素为:%d\n当前栈长度为:%d\n",e,StackLength(&S));
    	
    	ClearStack(&S);
    	printf("\n\n清空栈后:\n");
    	length=StackLength(&S);
    	printf("当前长度为:%d\n",length);
    	
    	DestroyStack(&S);
    	printf("\n销毁栈后:\n top=%u,base=%u,StackSize=%d",S.top,S.base,S.StackSize);
    	
    	return 0;
    } 
    

    十二、运行效果截图:
    在这里插入图片描述

    展开全文
  • 入栈时,top指针是 s.top++=e 还是s.++top=e? 出栈时,top指针是 s.top--=e 还是s.--top=e? 还有就是 top指针是指向栈顶元素or栈顶元素下一位置?
  • 栈--进栈,出栈指针修改的顺序问题

    万次阅读 多人点赞 2016-10-02 13:50:22
    策略设计一个顺序栈,附设的top指针有两种策略: 指向当前栈顶元素 指向栈顶上方空位 借助一篇文章深入分析二者的异同。top指向栈顶首先令top指向当前栈顶元素,这样进来一个新的元素时,新元素不能占据当前top指向...
  • 关于栈顶指针初值为-1和0的区别

    千次阅读 多人点赞 2021-02-25 13:36:16
    栈顶指针:S.top 栈顶元素:S.data[S.top] 当栈顶指针的初始值设置 S.top=-1时 ps: 当栈为空时,栈顶指针指向data[-1],但栈底是data[0] top data{4} data{3} data{2} data{1} data{0} data{-1} ...
  • //栈顶指针 }SqStack; /*栈的静态分配顺序存储,top为整数且指向栈顶元素的一个位置*/ void InitStack(SqStack *S) { S->top=0; } /*入栈(压栈)操作*/ Status PushStack(SqStack *S,Elemtype e) { if(S->...
  • PC(program counter)是CPU中用于存放下一条指令地址的寄存器,SP为堆栈指针。下面将介绍函数调用过程中CPU对PC和SP这两个寄存器的操作。 假设有如下函数Fun Fun() { ………………… Sub-fun(a, b);...
  • PTA_6-4 另类堆栈(15 分)_单指针

    千次阅读 2017-11-27 14:02:39
    在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满? 函数接口定义:bool Push( Stack S, ElementType X ); ElementType...
  • 满栈时栈顶指向哪里?不满栈时栈顶指向哪里?是否规则相同?求大神赐教
  • 数据结构(C语言版)实现顺序栈的创建,初始化,赋值随机数,入栈,出栈,获取栈顶元素,输出 ...通常用一维数组来实现栈的顺序存储,一般以数组小下标一端做栈底,每进栈一个元素,指针top+1,每出栈一个元素,top-1
  • C++转来写golang,对于golang中的一些东西确实感觉有点奇怪,不过还行 特别是包,之前要放在一个全局文件夹里,我不太喜欢,后面的版本go才支持... fmt.Printf(top is : %d\n, s1.Top()) s1.Pop() fmt.Printf(top is
  • 数据结构(20)图的拓扑排序

    千次阅读 多人点赞 2020-08-04 08:53:45
    } 如果不想使用先前写好的栈结构的话,可以外设一个top指针来达到栈的结果,此时count数组有两个功能:若顶点还未需要访问,则count数组中保存的是当前顶点的入度;若顶点的入度为0,则count数组中保存的是下一个要...
  • 什么是指向指针指针? 悬空指针 指针从哪里开始? 局部变量和指针之间的差异 那么什么时候没有指针就不可能实现? 但是,有那么多神奇的智能指针! 什么是调用堆栈和堆栈溢出.. 不能没有指针-案例1 不能...
  • 总是不懂指针 看了一个csdn的问题 豁然开朗在写一个栈的东西,在销毁的时候有点小问题 #define POSITION int #define SIZE_T int #define ELEMTYPE char #define BUTTOM -1 struct stStack { POSITION top; ELEMTYPE...
  • C++指针和栈的学习

    2020-07-28 13:03:49
    输出后就是2 5 用指针模拟栈的几种基本操作 栈的操作有以下几种:(自己写的,有增加了几个) 判断是否为空(empty) 首位数字出栈(pop) 加进一个数入栈(push) 取首位数字(top) 事先准备两个指针,分别是top和...
  • UE4 智能指针使用介绍

    万次阅读 多人点赞 2021-05-25 10:16:04
    共享指针/共享引用/弱指针/注意事项一.TSharePtr1.如何创建一个TSharePtr2.TSharePtr如何进行类型转换1)TSharePtr转TSharePtr2)Const TSharePtr转TSharePtr3)TSharePtr转TShareRef3.使用注意事项1)TSharePtr2)类型...
  • 【单选题】条件语句“Where 工资额>1000”的意思是【单选题】以下查询中不能更改数据库中表记录的是__。【单选题】以下关于查询显示结果中字段名显示的叙述,正确的是__。【单选题】在创建带子窗体的窗体时,主窗体...
  • 一、前言 为什么需要这木书 ...我在授课时,很早 便开始讲授指针,而且在以后的授课过程中也经常讨论指针。我描述它们在各种不同的上 卜’文环境中的有效用法,展示使用指针的编程惯用法(programming idiom)=,我
  • 指针与函数指针

    千次阅读 2016-04-10 17:36:20
    指针 void pointers指针void 是一种特殊类型的指针。void 指针可以指向任意类型的数据,可以是整数,浮点数甚至字符串。唯一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用星号*),因为它的长度是...
  • 结构体指针的内存空间分配问题(C语言) 提示:文章结尾有两个代码的合并的精简版! 结构体指针在使用前,必须分配内存空间给该结构体指针,否则会导致数据无法录入;在给结构体指针分配内存空间时又分两种情况,...
  • 顺序栈栈顶指针指向详析

    千次阅读 2020-03-25 14:23:09
    顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10... //定义栈顶指针top SElemType *base; //定义栈底指针base int stacksi...
  • //栈顶指针,这个栈结构没有bottom指针,感觉更简洁! } Status InitStack(LStack &s) //构造一个空栈 { struct LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) { printf("存储分配失败!"); exit...
  • 堆栈指针是什么_有什么作用

    千次阅读 2021-07-22 00:59:51
    描述堆栈指针总是指向栈顶位置。一般堆栈的栈底不能动,所以数据入栈前要先修改堆栈指针,使它指向新的空余空间然后再把数据存进去,出栈的时候相反。堆栈指针,随时跟踪栈顶地址,按“先进后出”的原则存取数据。...
  • 双向栈的实现(数组) C语言

    千次阅读 2019-05-07 22:24:22
    把两个栈的栈底分别设在顺序存储空间(如数组v[n])的两端,每个栈都有各自独立的栈底和栈顶指针。栈底位置不变。入栈时,各自的栈顶向中间伸展,仅当两个栈的栈顶相遇时才可能发生上溢。由于两个栈...
  • 顺序栈-初始化栈顶指针为01.头文件及类型定义2.顺序栈类型定义3.函数声明4.基本操作4.1 初始化顺序栈4.2 判空4.3 入栈4.4 出栈4.5 读取栈顶元素4.6 main函数5.小结 1.头文件及类型定义 #include<stdio.h> #...
  • 当第0 号栈的栈顶指针 top[0]等于-1 时该栈为空;当第 1 号栈的栈顶指针 top[1]等于 m 时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈 和出栈等算法的函数。双栈数据...
  • C51中的函数指针

    千次阅读 2020-09-01 21:33:43
    函数指针是C编程语言众多难懂的特性之一。由于C编译器对关于8051架构的独特要求,函数指针和可重入函数需要克服更大的挑战。这主要是因为函数参数传递的方式。 通常,(对于大多数非8051的芯片),函数参数是在栈上以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,669
精华内容 58,267
关键字:

top指针