精华内容
下载资源
问答
  • 在C语言数据结构教材中常提到 : top指针,但是在top指针里面存放的一个整型数据,需要注意的,此指针而非C语言里面的指针,C语言中的指针是存放的指向下一个数据元素的地址。 在栈式存储中,定义的结构体类型在...

    理解静态栈中的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是整型数值,但还是把它叫做指针了吧。。。”

    展开全文
  • ``` #include #include #define MaxSize 50 typedef int ElemType;...typedef struct Node *Position;... int top = -1, k, j = 0;... case '(':top++; St[top] = p;... case')':top--;...请问大佬们这是为什么呀?
  • //整型变量top存储栈顶元素的下标,作为栈顶指针top为-1时表示空栈 }SeqStack; int InitStack(SeqStack *);//初始化栈,即将一个栈清除为空 int StackEmpty(SeqStack *);//检查一个栈是否为空 int pop...
  • //整型变量top存储栈顶元素的下标,作为栈顶指针top为-1时表示空栈 }SeqStack; int InitStack(SeqStack *);//初始化栈,即将一个栈清除为空 int StackEmpty(SeqStack *);//检查一个栈是否为空 int Create...
  •  //arr临时指针变量  s.m = initsize;    s.bot[0] = 0;  s.bot[0] = s.m - 1;    s.top[0] = 0;  s.top[1] = s.m - 1; } <p>int ...
  • 小白一枚,平常在学校学的VC6.0,并不清楚两种开发软件有什么区别也不知道该怎么改,求大神指点!! #include "StdAfx.h" #include #include #include #include using namespace std; double D_Operate(double x,...
  • //注意这里的e是指针 写成e = *(S.top - 1这个样子 有一定的不妥当 return OK; }; Status push (SqStack *S,SElemType e)//元素入栈 { if(S->top - S->base >= S->stacksize)//栈满,增加空间! { S->...
  • 为什么知道了指向栈底部的指针S就可以用 S->Next->data 得知栈顶元素,这个我自己实验过对的。 因为假如这个栈由3个链表连起来的,S->Next->data应该得到的第二个链表里面的元素啊。 S->Next->Next->data才...
  • //根据栈顶指针的位置返回是否满 } template bool seqstack<Type>::push(Type &item)//数据进栈 { stackspace[++top]=item;//实际进栈的操作,具体分为两步:先产生地址,后插入数据 count++;//进栈...
  • 这道题涉及到双指针,一前一后循环遍历,唯一要理解的点就是题意以及为什么height[i] < height[j]时,++i的原因,也可以这么理解,那边小的那边就往前推进,因为我要取最大值,有点类似于短板效应。 具体可看...

    在这里插入图片描述
    思路:
    这道题的意思就是选择两根柱子,其他的你可以视而不见(消失不见了),那么由着两根柱子围成的水量有多少。
    这道题涉及到双指针,一前一后循环遍历,唯一要理解的点就是题意以及为什么height[i] < height[j]时,是++i的原因,也可以这么理解,那边小的那边就往前推进,因为我是要取最大值,有点类似于短板效应。
    具体可看看人家写的解释,请点击!

    代码:

    class Solution {
    public:
        int maxArea(vector<int>& height) {
            int l = 0,r = height.size()-1;
            int sum = 0;
            while(l<r){
                sum = max(sum,min(height[l],height[r])*(r-l));
                if(height[l]<height[r]){
                    ++l;
                }else{
                    --r;
                }
            }
            return sum;
        }
    };
    
    展开全文
  • 利用栈存储指向一个二叉树结点的指针,可不知为什么,在进行中序遍历时,进行调试时总卡在GetTop()函数这里,请大神帮我看看 #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK...
  • int fact(int n,int f,PSeqStack S)//调用函数为什么不对?求解释! { Init_SeqStack(S); while(n!=0) { Push_SeqStack(S,n); n=n-1; } f=1; while(Empty_SeqStack(S)!=1) { Pop_SeqStack(S,n); f=...
  • //把控件地址赋给窗口类指针 //定义一个控件尺寸结构体 pWnd->GetClientRect(&rc);//获取控件尺寸并赋值给rc /* RECT rect; pWnd->GetWindowRect(&rect); m_pDC = pWnd->GetDC(); InvalidateRect(&rc); //使得...
  • Status EnQueue(LinkQueue *Q, char e) {//链队列带头节点的,头指针永远指向头节点 QueuePtr q = (QueuePtr)malloc(sizeof(QNode)); if (!q) exit(OVERFLOW); q->data = e; q->next = NULL; Q->rear->next =...
  • 15.给定的两个点(Point):左上点(top_left)和右下点(bottom_right),将此指定区域内的new_img对象图像进行裁剪操作,并显示结果。 16.求图像的所有像素点的均值和方差,并输出。 17.交换两个Image对象的数据。...
  • 2021-04-11

    2021-04-11 14:24:56
    什么是栈,先进后出,是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端栈底,不含任何元素的称为空栈。注意栈元素具有线性关系,即前驱后继,最先进栈的元素不一定最后出栈。 栈...

    栈总结(c语言数组和链表实现)

    什么是栈,先进后出,是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端为栈底,不含任何元素的称为空栈。注意栈元素具有线性关系,即前驱后继,最先进栈的元素不一定最后出栈。
    栈的顺序存储结构
    结构定义

    #define MAXSIZE 5
    typedef struct sqstack {
    	int data[MAXSIZE];
    	int top;//栈顶指针,不是指针类型
    };
    

    进栈操作

    int main(void) {
    	sqstack* s = (sqstack*)malloc(sizeof(sqstack));//申请指定空间的栈
    	s->top = -1;
    	sqpush(&s,1);//传不传指针都行,改变的是s的内部不是s自身
    	printf("%d", s->data[0]);
    	return 0;
    }
    
    void sqpush(sqstack** s, int x) {
    	if ((*s)->top == MAXSIZE - 1) {
    		printf("OverFlow");
    		return 0;
    	}
    	(*s)->top++;
    	(*s)->data[(*s)->top] = x;
    }
    
    

    出栈

    void spop(sqstack* s) {
    	if (s->top ==  - 1) {
    		printf("OverFlow");
    
    	}
    	else {
    		s->top--;
    	}
    }
    

    链表实现
    入栈

    void spush(STACK** stack, int x) {//入栈
    	if (stack == NULL) {
    		printf("需要先创建stack!");
    		exit(-1);
    	}
    	else{
    		LinkStack* newnode = (LinkStack*)malloc(sizeof(LinkStack));
    		newnode->next = NULL;
    		newnode->data = x;
    		newnode->next = (*stack)->top;
    		(*stack)->top = newnode;
    	}
    	
    }
    void Printf(STACK* stack) {//打印栈
    	LinkStack* newnode;
    	if (stack->top == NULL) {
    		printf("空栈!");
    		exit(-1);
    	}
    	else {
    		newnode = stack->top;
    		do {
    			printf(" %d ", newnode->data);
    			newnode = newnode->next;
    		} while (newnode != NULL);
    	}
    	printf("\n");
    }
    
    

    出栈

    void sppop(STACK** stack) {
    	int x;//保存值
    	LinkStack* newnode;//释放的
    	if (stack == NULL || (*stack)->top == NULL) {
    		printf("空栈!");
    	}
    	else {
    		if ((*stack)->top->next == NULL) {//考虑只有一个结点
    			x = (*stack)->top->data;
    			newnode = (*stack)->top;
    			(*stack)->top = NULL;
    		}
    		else {
    			newnode = (*stack)->top;
    			(*stack)->top = newnode->next;
    			free(newnode);
    		}
    		return stack;
    
    	}
    }
    
    
    展开全文
  • /*如果迷宫有通道可解则正常运行,迷宫不可解为什么显示exe停止工作呢?怎样修改呢?*/ #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define STACK_INIT_SIZE 100 #define ...
  • 和顺序栈一样,为了在函数中修改结构体内容,函数参数结构体指针 一、数据类型 typedef struct Doublestack { int data[MAXSIZE]; int top1,top2; }Doublestack; 二、初始化 void Initial

    零、说明

    1. 两栈共用空间是为了解决顺序栈未满时只能利用部分空间的现象,让两个栈分别以数组头部和尾部作为栈底,向中间延伸,直到在中间相遇,即相当于两个栈都满了
    2. 事实上和顺序栈没什么两样,不过是要新增一个函数参数用于识别在哪个栈进行操作
    3. 和顺序栈一样,为了在函数中修改结构体内容,函数参数为结构体指针

    一、数据类型

    typedef struct Doublestack
    {
    	int data[MAXSIZE];
    	int top1,top2;
    }Doublestack;
    

    二、初始化

    void Initial(Doublestack *D)
    {
    	D->top1=-1;
    	D->top2=MAXSIZE;
    }
    

    三、入栈出栈

    1. 入栈
    void Push(Doublestack *D,int data,int stackname)
    {
    	if(D->top1!=D->top2-1)
    	{
    		if(stackname==1)
    		{
    			D->top1++;
    			D->data[D->top1]=data;
    		}
    		else
    		{
    			D->top2--;
    			D->data[D->top2]=data;
    		}
    	}
    	else
    	{
    		cout<<"FULL"<<endl;
    	} 
    }
    
    1. 出栈
    int Pop(Doublestack *D,int stackname)
    {
    	int ret;
    	ret=-1;
    	if(stackname==1)
    	{
    		if(D->top1!=-1)
    		{
    			ret=D->data[D->top1];
    			D->top1--;
    		}
    		else
    		{
    			cout<<"EMPTY"<<endl;
    		}
    	}
    	if(stackname==2)
    	{
    		if(D->top2!=MAXSIZE)
    		{
    			ret=D->data[D->top2];
    			D->top2++;
    		}
    		else
    		{
    			cout<<"EMPTY"<<endl;
    		}
    	}
    	return ret;
    }
    
    1. 得到栈顶
    int Gettop(Doublestack *D,int stackname)
    {
    	int ret;
    	if(stackname==1)
    	{
    		ret=D->data[D->top1];
    	}
    	else
    	{
    		ret=D->data[D->top2];
    	}
    	return ret;
    }
    

    四、使用

    int main()
    {
    	Doublestack D;
    	Initial(&D);
    	for(int i=1;i<=100;i++)
    	{
    		Push(&D,i,1);
    		Push(&D,1000-i,2);
    	}
    	Push(&D,114514,1);
    	Push(&D,1919810,2);
    	cout<<Gettop(&D,1)<<' ';
    	cout<<Gettop(&D,2)<<endl;
    	for(int i=1;i<=101;i++)
    	{
    		cout<<Pop(&D,1)<<' ';
    	}
    	cout<<endl;
    	for(int i=1;i<=100;i++)
    	{
    		cout<<Pop(&D,2)<<' ';
    	}
    	return 0;
    }
    
    展开全文
  • 今天脑袋迷迷糊糊的,愣不知道为什么出问题。。。 这一个中缀表达式转后缀表达式的程序,但不知道为什么,每次输入时最先入栈的符号都会输出两次,求各位大神指导! ``` #include #include #include #...
  • 1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点? 解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    为什么int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了= -------------------------------------------------...
  • void dfs_f(G*g, int*sign, int v){//前面的没什么问题主要这断没有达到深度非递归的算法我好头疼 Stack S; E*P; S.STACK = (E**)malloc(sizeof(E*)*g->Vlen); S.top = -1; printf("深度遍历:%c", g->vertex...
  • <code class="language-cs">#include<...为什么 <p style="text-align:center"><img alt="" height="364" src="https://img-ask.csdnimg.cn/upload/1619355541261.png" width="613" /></p>  </p>
  • MFC的程序框架剖析

    2015-03-05 09:53:19
    对了,还有一点要说明的:pTemplate一个CDocTemplate的指针,但接下来程序为什么会进入到CSingleDocTemplate::OpenDocumentFile的函数体内呢,这因为CDocTemplate类中的OpenDocumentFile函数被定义为纯虚函数...
  • 1) main 函数的栈帧空间为什么是40bytes?我的理解是(64位机器): 一个局部变量 addr 4bytes, 调用函数 Add 2(2<em>4bytes)个入参和1(1</em>4btyes)个返回值 调用 adder. ...
  • 4.4.0 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。 4.4.1 java8的新特性。 JVM 4.4.2 什么情况下会发生栈内存溢出。 4.4.3 JVM的内存结构,Eden和Survivor比例。 4.4.4 JVM...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行...
  • 打冰雹游戏源程序

    2013-06-16 00:07:04
    Shape1(i).Top = Shape1(i).Top + Int(Rnd * 40) If Shape1(i).Top > Picture1.ScaleHeight Then Shape1(i).Top = -500 Shape1(i).Left = Int(Rnd * 9000) Text2.Text = Text2.Text - 1 '冰雹掉落到下限时重新...
  • 指向此结点的指针。由于元件之间要相互连接的,于是设置这几个指针用于元件之间的连接。其中特殊情况有: 非门:由于非门只有一个输入端,所以非门不用tagMyNode* input2; 输入结点:输入结点只有一个链接端...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
热门标签
关键字:

inttop为什么是指针