栈顶指针,队头、队尾指针,和链式存储里面的指针域有区别吗?

诚挚问各位一个问题,栈有顺序存储和链式存储两种方式。链式存储,结构体定义里面的指针域定义时用到了计算机上的那个乘法符号(因为问答显示不了这个符号所以这样描述),而在顺序存储里面定义栈顶指针却是int top,这两个指针应该不是一个指针吧。
栈顶指针应该只是叫指针,它实际上就相当于一个中间量用来记录当前位置序号而不是实际的物理存储地址吧。
因为在看到队列的时候定义队头队尾指针时也是int ,没有用计算机那个乘法符号
,所以感觉很迷惑

链表中每个节点是个指针,所以用指针指向栈顶节点;而顺序存储中的top表示栈顶,是个整型,这个整型表示栈顶元素在顺序表中的序号。因为顺序表用序号就可以访问到元素了,而链表不能通过序号直接访问到节点,所以栈顶用节点指针记录

顺序存储的栈,是一块连续的空间,可以把他理解为数组,在顺序存储里面定义栈顶指针nt top,可以理解为数组的元素下标。数组名就是地址值,数组名+偏移量就是栈元素的实际存储地址值。
链式栈无非是用指针*next 来记录标注下一个空间的地址值,其作用和顺序栈的栈顶指针作用是一样的。
队列也是如此而已。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/751224
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里需要对堆有一定的了解,堆就是一个比较特殊的完全二叉树,在最大堆里,每个节点的值都大于其左右两个孩子节点的值。这就是最大堆。反之就是最小堆。拿最大堆举例子,每次堆顶的元素值,不就是当前数列的最大吗?这不就成选择排序里的简单排序了吗?找完之后,将他和完全二叉树里最后一个结点的值进行交换,然后做一个自顶向下的自我调整,将他再次调整成一个完全二叉堆。第二次取最大的树,这时我们需要将上一次找到的结点屏蔽掉,不然会陷入一个死循环。无数次找完之后,再按层序的思想将二叉树里的数据遍历到一个数组当中,这时的数组为一个有序的数组。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

  • 以下回答由chatgpt基于相关博客总结生成:

    栈的顺序存储和链式存储是两种不同的实现方式,它们在栈顶指针、队头指针和队尾指针以及链式存储中的指针域方面有一些区别。

    在栈的顺序存储中,使用数组来实现栈,栈顶指针指向当前栈顶元素的位置,栈底指针指向数组的第一个位置。当栈为空时,栈顶指针的值为-1。每次入栈操作时,先将栈顶指针加1,然后将元素放入栈顶指针所指向的位置。出栈操作时,先将栈顶指针指向的元素取出,然后将栈顶指针减1。栈的顺序存储示例代码如下:

    #define MAX_SIZE 100 // 栈的最大容量
    
    typedef struct {
        int data[MAX_SIZE]; // 存储栈元素的数组
        int top; // 栈顶指针
    } Stack;
    
    void push(Stack *stack, int item) {
        if (stack->top == MAX_SIZE - 1) {
            printf("Stack is full\n");
            return;
        }
    
        stack->top++;
        stack->data[stack->top] = item;
    }
    
    int pop(Stack *stack) {
        if (stack->top == -1) {
            printf("Stack is empty\n");
            return -1;
        }
    
        int item = stack->data[stack->top];
        stack->top--;
        return item;
    }
    

    在链式存储中,使用链表来实现栈。栈顶指针指向链表的头节点,每次入栈操作时,创建一个新节点,并将新节点插入到链表的头部,然后更新栈顶指针指向新节点。出栈操作时,将栈顶指针指向的节点删除,并将栈顶指针更新为指向删除节点的下一个节点。链式存储示例代码如下:

    typedef struct Node {
        int data; // 存储元素的值
        struct Node *next; // 指向下一个节点的指针
    } Node;
    
    typedef struct {
        Node *top; // 栈顶指针
    } Stack;
    
    void push(Stack *stack, int item) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->data = item;
        newNode->next = stack->top;
        stack->top = newNode;
    }
    
    int pop(Stack *stack) {
        if (stack->top == NULL) {
            printf("Stack is empty\n");
            return -1;
        }
    
        Node *temp = stack->top;
        int item = stack->top->data;
        stack->top = stack->top->next;
        free(temp);
        return item;
    }
    

    对于队头指针和队尾指针,它们主要用于实现队列的功能,不涉及到栈的存储方式。在队列的顺序存储中,队头指针指向队列的第一个元素,队尾指针指向队列的最后一个元素。入队操作时,先将队尾指针加1,然后将元素放入队尾指针所指向的位置。出队操作时,先获取队头指针所指向的元素,并将队头指针加1。队列的顺序存储示例代码如下:

    #define MAX_SIZE 100 // 队列的最大容量
    
    typedef struct {
        int data[MAX_SIZE]; // 存储队列元素的数组
        int front; // 队头指针
        int rear; // 队尾指针
    } Queue;
    
    void enqueue(Queue *queue, int item) {
        if (queue->rear == MAX_SIZE - 1) {
            printf("Queue is full\n");
            return;
        }
    
        queue->rear++;
        queue->data[queue->rear] = item;
    }
    
    int dequeue(Queue *queue) {
        if (queue->front > queue->rear) {
            printf("Queue is empty\n");
            return -1;
        }
    
        int item = queue->data[queue->front];
        queue->front++;
        return item;
    }
    

    对于指针域的定义中使用了一个乘法符号的问题,这是链式存储的特殊表示方式。在链表节点中,指针域用来存储指向下一个节点的指针,以便实现链表的连接。而乘法符号(->)代表解引用操作符,用来访问指针指向的节点中的成员。例如,stack->top表示指针stack所指向的结构体中的成员top

    希望以上解答对你有帮助,如有疑问请继续追问。