首页 > 其他分享 >12月18日总结

12月18日总结

时间:2025-01-10 18:44:25浏览次数:1  
标签:总结 12 return int 18 top 元素 栈顶 Stack

今日学习了栈的相关操作:
初始化:

define MAX_SIZE 100 // 假设栈的最大容量为 100

typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;

// 栈的初始化函数
void initStack(Stack *s) {
s->top = -1;
}
一、增 - 入栈(Push)
入栈操作是向栈顶添加一个新元素,使其成为新的栈顶元素。以顺序栈(基于数组实现)为例,当执行入栈时:
首先需要判断栈是否已满。若栈已满,继续入栈会导致栈溢出错误,此时通常需要给出相应提示信息,告知用户栈空间不足。
若栈未满,将栈顶指针(top)向上移动一位(在基于数组实现且栈顶指针初始化为 -1 的情况下,表现为 top++),使其指向新的栈顶位置。
最后,把要入栈的元素存储到栈顶指针所指向的存储单元,即完成了一个元素的入栈操作。
例如,使用 C 语言代码实现:

define MAX_SIZE 100 // 假设栈的最大容量为 100

typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;

void push(Stack *s, int value) {
if (s->top == MAX_SIZE - 1) {
printf("Stack Overflow\n");
return;
}
s->top++;
s->data[s->top] = value;
}

二、删 - 出栈(Pop)
出栈操作是将栈顶元素从栈中移除,并返回被移除的元素值。步骤如下:
先判断栈是否为空。因为空栈没有元素可供移除,若对空栈执行出栈操作,会引发错误,所以要提前检查,若为空栈需给出提示。
若栈非空,取出当前栈顶元素(存储在栈顶指针所指向位置,即 s->data[s->top]),用于后续返回或其他处理。
然后将栈顶指针向下移动一位(在常见实现中表现为 top--),使栈顶指针指向新的栈顶元素,即完成出栈操作。
示例代码:
int pop(Stack *s) {
if (s->top == -1) {
printf("Stack Underflow\n");
return -1;
}
int value = s->data[s->top];
s->top--;
return value;
}

三、改 - 栈内元素修改
栈本身的结构特性决定了它并不像数组等数据结构那样方便直接修改内部任意位置的元素。但在特定场景下,如果要修改栈顶元素,由于栈顶元素可直接访问:
先判断栈是否为空,只有非空栈才有栈顶元素可供修改。
若栈非空,直接对栈顶指针所指向的存储单元进行赋值操作,即可完成栈顶元素的修改。
例如:
void modifyTop(Stack *s, int newValue) {
if (s->top == -1) {
printf("Stack is empty, cannot modify.\n");
return;
}
s->data[s->top] = newValue;
}

不过,一般情况下不会频繁修改栈内元素,因为这可能破坏栈后进先出的逻辑顺序,除非有特殊业务需求。
四、查 - 查找操作
查找栈顶元素:这是最常见的查找操作,由于栈顶元素可直接通过栈顶指针访问,只需判断栈非空后,直接返回栈顶指针所指向的元素值即可。
示例:
int peek(Stack *s) {
if (s->top == -1) {
return -1; // 也可根据实际需求返回其他标识值表示栈空
}
return s->data[s->top];
}

查找特定元素:要在栈中查找是否存在特定值的元素,通常需要从栈顶开始,依次向下遍历栈中的元素,直到找到匹配元素或遍历完整个栈。但这种操作相对不那么符合栈的常规使用场景,因为栈主要用于处理后进先出的顺序问题,频繁查找特定元素会增加时间复杂度,且破坏其操作简洁性。不过在某些调试或特殊需求下可能会用到:
示例代码:
int search(Stack *s, int target) {
int i;
for (i = s->top; i >= 0; i--) {
if (s->data[i] == target) {
return i; // 返回找到元素的位置索引,若为 -1 则表示未找到
}
}
return -1;
}

综上,数据结构栈的增删改查操作各有特点,在实际应用中要依据栈的特性合理运用,避免错误操作,充分发挥栈在处理特定顺序问题上的优势。

标签:总结,12,return,int,18,top,元素,栈顶,Stack
From: https://www.cnblogs.com/Genghao11/p/18664514

相关文章

  • 12月19日总结
    今日深入学习了数据结构中的队列,它与之前所学的栈有着截然不同的特性。概念上,队列遵循先进先出(FIFO)原则,就如同日常生活中的排队场景,先到的人先接受服务,最先进入队列的元素最先被取出。它有队头(front)和队尾(rear)两个关键指针,分别用于标识队列的起始位置和末尾位置,元素从队尾进入,从......
  • 12月24日
    学习内容概述今日深入学习了Java中的泛型(Generics)机制,这是Java语言的一个重要特性,用于在编译时提供类型安全的集合和方法。泛型可以提高代码的复用性、可读性和安全性,是现代Java编程中不可或缺的一部分。泛型的基本概念泛型是一种在编译时提供类型检查的机制,允许在定义类、接口......
  • 12月15日
    今日重点学习了Java中的多线程编程,这是现代编程中实现并发和提高程序性能的关键技术。多线程可以让程序同时执行多个任务,充分利用计算机的多核处理器资源,提升程序的执行效率和响应速度。线程是程序执行的最小单位,是操作系统能够进行调度的最小单位。一个进程可以包含多个线程,这些......
  • 12月16日
    在多线程环境中,多个线程可能会同时访问和修改共享资源,这可能导致数据不一致和竞态条件等问题。为了保证数据的正确性和一致性,需要对线程进行同步和互斥控制。同步代码块:通过在代码块前加上synchronized关键字,可以将代码块标记为同步代码块。同步代码块需要指定一个锁对象,当线程进......
  • 12月12日总结
    今日复习了线性表中顺序表的相关操作初始化:voidInitList(SqList&L){ //申请存储空间 L.data=(int*)malloc(InitSize*sizeof(int)); L.length=0; L.MaxSize=InitSize;}插入:boolListInsert(SqList&L,inti,inte){ if(i<1||i<L.length+1) //判断i的范围是否有......
  • 12月17日
    今天主要学习了Java中的输入输出(I/O)系统,这是Java编程中用于处理数据输入和输出的核心机制。I/O系统提供了丰富的类和接口,用于读取和写入文件、网络数据等,是实现程序与外部世界交互的重要工具。JavaI/O框架主要分为两个部分:字节流(ByteStreams)和字符流(CharacterStreams)。字节......
  • 12月13日总结
    今日深入学习了数据结构中的单链表,收获颇丰。在概念理解上,单链表是由一系列节点组成的数据结构,每个节点包含数据域和指向下一节点的指针域,通过指针依次相连,形成一条线性链状结构。与数组相比,它的优势在于动态分配内存,无需预先指定大小,能灵活地进行插入和删除操作。学习过程中,重......
  • 12月18日
    今天继续学IO流文件读取(FileReader)FileReader用于从文件中读取字符数据。例如,读取一个文本文件:javaimportjava.io.FileReader;importjava.io.IOException;publicclassFileReaderExample{publicstaticvoidmain(String[]args){try(FileReaderfr=newFileReade......
  • 12月19日
    今日深入学习了Java中的网络编程,这是Java编程中用于实现网络通信的重要部分。通过网络编程,Java程序可以与其他计算机上的程序进行数据交换和通信,实现客户端-服务器(C/S)架构和分布式系统。Java网络编程主要涉及两个方面:套接字(Socket)编程和URL处理。套接字是网络通信的基础,它提供了......
  • 12月20日
    今天继续学习网络编程多线程服务器在实际应用中,服务器通常需要同时处理多个客户端连接。多线程服务器可以通过为每个客户端连接创建一个新线程来实现。例如:javaimportjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassMultiThreadedServer{......