C语言遍历栈内所有元素
时间: 2023-10-14 18:29:48 浏览: 64
可以使用指针来实现栈的遍历,从栈顶开始依次往下遍历即可。以下是一个示例代码:
```c
void traverseStack(Stack* stack) {
if (isEmpty(stack)) {
printf("Stack is empty.\n");
return;
}
StackNode* current = stack->top;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
```
该函数使用一个指针变量current来表示当前遍历到的节点,从栈顶开始遍历,直到遍历到栈底(即当前节点为NULL)。每次遍历到一个节点,就输出该节点的数据,并将指针current指向下一个节点,直到遍历完整个栈为止。
相关问题
C语言二叉树遍历栈实现
二叉树的遍历可以使用栈来实现,这里我以中序遍历为例进行说明。下面是使用栈实现中序遍历的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点的定义
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 栈的定义
struct Stack {
int top;
int capacity;
struct TreeNode** array;
};
// 创建一个新的栈
struct Stack* createStack(int capacity) {
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->top = -1;
stack->capacity = capacity;
stack->array = (struct TreeNode**)malloc(stack->capacity * sizeof(struct TreeNode*));
return stack;
}
// 判断栈是否为空
int isEmpty(struct Stack* stack) {
return stack->top == -1;
}
// 判断栈是否已满
int isFull(struct Stack* stack) {
return stack->top == stack->capacity - 1;
}
// 入栈操作
void push(struct Stack* stack, struct TreeNode* item) {
if (isFull(stack)) {
return;
}
stack->array[++stack->top] = item;
}
// 出栈操作
struct TreeNode* pop(struct Stack* stack) {
if (isEmpty(stack)) {
return NULL;
}
return stack->array[stack->top--];
}
// 获取栈顶元素
struct TreeNode* peek(struct Stack* stack) {
if (isEmpty(stack)) {
return NULL;
}
return stack->array[stack->top];
}
// 中序遍历二叉树(非递归)
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
struct Stack* stack = createStack(100); // 创建一个容量为100的栈
struct TreeNode* current = root;
while (current != NULL || !isEmpty(stack)) {
// 遍历左子树并入栈
while (current != NULL) {
push(stack, current);
current = current->left;
}
// 弹出栈顶元素并访问
current = pop(stack);
printf("%d ", current->data);
// 遍历右子树
current = current->right;
}
free(stack);
}
// 测试
int main() {
// 创建一个二叉树
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->data = 1;
root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->data = 2;
root->left->left = NULL;
root->left->right = NULL;
root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->data = 3;
root->right->left = NULL;
root->right->right = NULL;
// 中序遍历二叉树
printf("中序遍历结果:");
inorderTraversal(root);
// 释放内存
free(root->left);
free(root->right);
free(root);
return 0;
}
```
这段代码实现了中序遍历的非递归算法,通过栈来辅助遍历二叉树。首先定义了树结点的结构体 `TreeNode` 和栈的结构体 `Stack`,然后实现了栈的基本操作(创建栈、判断栈是否为空、判断栈是否已满、入栈、出栈、获取栈顶元素)。最后,在 `inorderTraversal` 函数中实现了中序遍历的非递归算法。在 `main` 函数中创建了一个二叉树,并调用 `inorderTraversal` 函数进行中序遍历。
你可以根据需要修改代码来实现其他遍历方式,比如前序遍历和后序遍历。希望这能帮到你!如果有其他问题,请继续提问。
后序遍历的非递归算法c语言栈实现
后序遍历的非递归算法可以使用栈来实现。具体步骤如下:
1. 初始化一个空栈,将根节点压入栈中。
2. 取出栈顶元素,如果该元素没有左右子节点,则输出该元素的值,如果有,则按照右节点、左节点的顺序依次将其子节点压入栈中。
3. 重复第2步,直到栈为空。
下面是C语言代码实现:
```c
void postOrderTraversal(TreeNode* root) {
if (root == NULL) return;
Stack stack;
TreeNode* prev = NULL;
push(&stack, root);
while (!isEmpty(&stack)) {
TreeNode* curr = peek(&stack);
if (prev == NULL || prev->left == curr || prev->right == curr) {
// 如果当前节点是根节点或者上一次访问的节点是它的子节点,则将其子节点(如果有)压入栈中
if (curr->left != NULL) push(&stack, curr->left);
else if (curr->right != NULL) push(&stack, curr->right);
} else if (curr->left == prev) {
// 如果当前节点的左子节点是上一次访问的节点,则将其右子节点(如果有)压入栈中
if (curr->right != NULL) push(&stack, curr->right);
} else {
// 否则,输出当前节点的值并弹出栈顶元素
printf("%d ", curr->val);
pop(&stack);
}
prev = curr;
}
}
```
其中,`TreeNode` 表示二叉树节点的结构体,`Stack` 表示栈的结构体,`push`、`pop`、`isEmpty` 和 `peek` 分别表示入栈、出栈、判断栈是否为空和获取栈顶元素的函数。在实现时需要注意,因为要输出每个节点的值,所以需要保存上一次访问的节点,用于判断当前节点是其父节点的左子节点还是右子节点。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)