栈顶指针指向不同位置的区别
| 操作/状态 | 栈顶指针指向栈顶元素(top 指向实际元素) | 栈顶指针指向栈顶元素的下一个位置(top 指向空位置) |
|---|---|---|
| 栈空条件 | top == -1 | top == 0 |
| 栈满条件 | top == MaxSize - 1 | top == MaxSize |
| 初始化 | top = -1 | top = 0 |
| 入栈操作 | 先 top++,再 data[top] = x | data[top] = x;然后 top++ |
| 出栈操作 | x = data[top];然后 top— | top—;然后 x = data[top] |
| 读栈顶元素 | x = data[top] | x = data[top - 1] |
| 栈空判定代码示例 | if(top == -1) stack empty | if(top == 0) stack empty |
| 入栈代码示例 | data[++top] = x; | data[top++] = x; |
| 出栈代码示例 | x = data[top--]; | x = data[--top]; |
| 指针含义 | top 指向当前栈顶元素所在位置 | top 指向栈顶元素的下一个空位置 |
| 优缺点 | 逻辑直观,top 直接指向栈顶元素,访问方便 | top 指向空位置,入栈时直接赋值,出栈时先移动指针,代码稍有不同 |
总结:
- 当栈顶指针指向栈顶元素时,栈空时 top 为 -1,入栈时先将 top 加 1 再赋值,出栈时先取值再将 top 减 1
- 当栈顶指针指向栈顶元素的下一个位置时,栈空时 top 为 0,入栈时先赋值再将 top 加 1,出栈时先将 top 减 1 再取值
- 两种方式的核心都是通过 top 指针的移动来指示数据的存取位置,区别在于 top 指针指向的是栈顶元素还是栈顶元素的下一个空位置