top() 函数并不是 C 语言标准库(如 stdio.h, stdlib.h 等)的一部分。

(图片来源网络,侵删)
top() 是一个函数名,通常用在数据结构的实现中,特别是栈,它的作用是“查看”栈顶的元素,但不删除它。
下面,我将从以下几个方面来解释 top() 在 C 语言中的使用:
top()的核心概念与作用- 如何用 C 语言手动实现一个带
top()的栈 - C++ 中的
top()(作为对比) - 常见的混淆与总结
top() 的核心概念与作用
top() 是栈这种数据结构的一个基本操作,栈的特点是“后进先出”(LIFO - Last In, First Out),想象一下一摞盘子,你最后放上去的盘子,会最先被拿走。
top() 函数的作用就是:

(图片来源网络,侵删)
- 访问:获取栈顶元素的值。
- 不修改:它只是“看一眼”栈顶的元素,然后将这个元素的值返回给调用者,栈本身(包括栈顶指针)不会发生任何变化。
这与 pop() 函数形成鲜明对比:
pop():移除并返回栈顶元素,操作后,栈的大小会减一。top():只返回栈顶元素,操作后,栈的大小和内容都不变。
如何用 C 语言手动实现一个带 top() 的栈
在 C 语言中,因为没有内置的栈类型,我们需要自己用结构体和指针来实现,下面是一个完整的、可运行的例子,展示了如何实现一个栈,并包含 push, pop, 和 top 函数。
实现代码
#include <stdio.h>
#include <stdlib.h>
// 1. 定义栈中单个节点的结构
typedef struct Node {
int data; // 存储数据
struct Node* next; // 指向下一个节点的指针
} Node;
// 2. 定义栈的结构
typedef struct {
Node* top; // 指向栈顶节点的指针
int size; // 记录栈中元素的数量(可选,但很有用)
} Stack;
// 3. 函数声明
Stack* createStack();
void push(Stack* stack, int value);
int pop(Stack* stack);
int top(Stack* stack);
int isEmpty(Stack* stack);
void freeStack(Stack* stack);
// 4. 主函数 - 测试我们的栈实现
int main() {
// 创建一个新栈
Stack* myStack = createStack();
// 向栈中压入元素
push(myStack, 10);
push(myStack, 20);
push(myStack, 30);
printf("Stack after pushes:\n");
// 此时栈顶是 30
printf("Top element is: %d\n", top(myStack)); // 应该输出 30
printf("Stack size is: %d\n\n", myStack->size);
// 弹出元素
printf("Popping element: %d\n", pop(myStack)); // 应该输出 30
printf("Top element after pop is: %d\n", top(myStack)); // 现在栈顶是 20
printf("Stack size is: %d\n\n", myStack->size);
// 再看一眼栈顶,不删除
printf("Looking at top again: %d\n", top(myStack)); // 依然是 20
printf("Stack size remains: %d\n\n", myStack->size);
// 释放栈内存
freeStack(myStack);
return 0;
}
// 创建一个空栈
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
if (!stack) {
perror("Failed to allocate memory for stack");
exit(EXIT_FAILURE);
}
stack->top = NULL;
stack->size = 0;
return stack;
}
// 压入元素
void push(Stack* stack, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
perror("Failed to allocate memory for new node");
exit(EXIT_FAILURE);
}
newNode->data = value;
newNode->next = stack->top; // 新节点的 next 指向当前的栈顶
stack->top = newNode; // 更新栈顶指针为这个新节点
stack->size++;
}
// 弹出元素
int pop(Stack* stack) {
if (isEmpty(stack)) {
fprintf(stderr, "Error: Stack is empty. Cannot pop.\n");
exit(EXIT_FAILURE);
}
Node* temp = stack->top;
int poppedValue = temp->data;
stack->top = stack->top->next; // 栈顶指针下移
free(temp); // 释放旧栈顶节点的内存
stack->size--;
return poppedValue;
}
// 查看栈顶元素
int top(Stack* stack) {
if (isEmpty(stack)) {
fprintf(stderr, "Error: Stack is empty. No top element.\n");
exit(EXIT_FAILURE);
}
return stack->top->data; // 直接返回栈顶节点的数据
}
// 检查栈是否为空
int isEmpty(Stack* stack) {
return stack->top == NULL;
}
// 释放整个栈的内存
void freeStack(Stack* stack) {
while (!isEmpty(stack)) {
pop(stack); // 不断弹出直到栈为空
}
free(stack); // 最后释放栈结构体本身
}
代码解析
Node结构体:代表栈中的一个“节点”,包含数据 (data) 和指向下一个节点的指针 (next)。Stack结构体:代表整个“栈”,包含一个指向栈顶的指针 (top) 和一个记录大小的整数 (size),使用size可以让isEmpty()和top()等操作更清晰。- *`top(Stack stack)` 函数**:
- 检查栈是否为空,如果为空,打印错误信息并退出程序(或者你可以选择返回一个特殊值,
INT_MIN,但需要让调用者知道这个约定)。 - 如果栈不为空,它就简单地访问
stack->top->data并返回这个值。 - 整个过程中,
stack->top指针没有移动,size也没有改变,完美符合“只查看不修改”的原则。
- 检查栈是否为空,如果为空,打印错误信息并退出程序(或者你可以选择返回一个特殊值,
C++ 中的 top() (作为对比)
了解 C++ 中的 top() 会让你更好地理解这个概念,因为它在标准库中被标准化了。
在 C++ 中,你通常使用 std::stack 容器适配器。

(图片来源网络,侵删)
#include <iostream>
#include <stack>
int main() {
std::stack<int> myStack;
myStack.push(10);
myStack.push(20);
myStack.push(30);
// C++ 的 top() 函数
std::cout << "Top element is: " << myStack.top() << std::endl; // 输出 30
// pop() 函数
myStack.pop();
std::cout << "Top element after pop is: " << myStack.top() << std::endl; // 输出 20
return 0;
}
C++ 的 top() 和我们 C 语言实现的 top() 在行为和概念上完全一致,C++ 的优势在于它已经为你实现了这些数据结构,你直接拿来用即可,无需关心底层的内存管理。
常见的混淆与总结
| 函数 | 行为 | 是否修改栈 | 返回值 |
|---|---|---|---|
top() |
查看栈顶元素 | 否 | 栈顶元素的值 |
pop() |
移除栈顶元素 | 是 | 被移除的元素的值 |
push() |
添加元素到栈顶 | 是 | 通常返回 void |
top()不是 C 关键字或库函数:它是一个自定义的函数名,主要用于实现栈数据结构。- 核心功能:
top()的唯一目的是安全地访问栈顶元素,而不改变栈的状态。 - 实现要点:在 C 语言中实现
top()时,必须首先检查栈是否为空,否则会导致访问空指针(NULL->data)的严重错误。 - 与
pop()的区别:top()是“偷看”,pop()是“拿走并吃掉”,这是理解栈操作的关键。
当你看到 C 语言代码中出现 top() 时,几乎可以肯定它是在操作一个自定义的栈结构,并且这个函数的作用就是获取栈顶的值。
