本文章介绍了如何在C语言环境中实现栈这种数据结构的基本操作,包括初始化、入栈、出栈以及获取栈顶元素等方法。
在C语言中,栈是一种非常重要的数据结构,它遵循“后进先出”(LIFO)的原则。由于C语言本身不提供内置的栈类型,因此程序员需要自行实现栈的操作。
首先定义一个表示节点的结构体`struct Node`:
```c
typedef struct Node {
int data;
struct Node *pNext;
} NODE, *PNODE;
```
接着定义另一个结构体`struct Stack`来表示整个栈。此结构包含两个指针:指向栈顶元素的 `pTop` 和指向栈底元素的 `pBottom`:
```c
typedef struct Stack {
PNODE pTop;
PNODE pBottom;
} STACK, *PSTACK;
``
下面是一些基本操作的具体实现方式:
1. **初始化栈**:函数 `init(PSTACK)` 用于创建一个空栈。它首先分配一块内存作为初始节点,并将该指针同时赋值给`pTop`和`pBottom`,确保两者相等。
```c
void init(PSTACK pS) {
pS->pTop = (PNODE)malloc(sizeof(NODE));
if(NULL == pS->pTop){
printf(动态内存分配失败\n);
exit(-1);
} else {
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}
}
```
2. **入栈**:函数 `push(PSTACK, int)` 用于将一个元素压入栈顶。它创建一个新的节点,存储给定的值,并更新`pTop`指向新节点。
```c
void push(PSTACK pS, int val) {
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
}
```
3. **遍历栈**:函数 `traverse(PSTACK)` 遍历整个栈并打印所有元素,从`pTop`开始沿着`pNext`指针到达`pBottom`。
```c
void traverse(PSTACK pS) {
PNODE p = pS->pTop;
while(p != pS->pBottom){
printf(%d , p->data);
p = p->pNext;
}
printf(\n);
}
```
4. **判断栈是否为空**:函数 `empty(PSTACK)` 检查`pTop`和`pBottom`指针是否相等,如果相等则返回真值表示栈为空。
```c
bool empty(PSTACK pS) {
if(pS->pTop == pS->pBottom){
return true;
} else {
return false;
}
}
```
5. **出栈**:函数 `pop(PSTACK, int*)` 从栈顶移除一个元素,并通过传入的指针返回该值。如果栈为空,则返回假。
```c
bool pop(PSTACK pS, int *pVal) {
if(empty(pS)){
return false;
} else {
PNODE r = pS->pTop;
*pVal = r->data;
pS->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
}
```
6. **清空栈**:函数 `clear(PSTACK)` 遍历整个栈,释放每个节点的内存,并将`pTop`和`pBottom`指针重置。
```c
void clear(PSTACK pS) {
if(empty(pS)) {
return;
} else {
PNODE p = pS->pTop;
PNODE q = NULL;
while(p != pS->pBottom) {
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
}
```
以上就是C语言中栈的基本操作实现。在实际编程时,可以根据需求灵活运用这些函数,例如在表达式求值或递归调用等场景下使用它们。掌握并理解这些基本操作有助于解决各种算法问题。