链栈

链栈

1.链栈结构定义

1
2
3
4
5
6
typedef int LSTDataType;

typedef struct StackNode {
LSTDataType data; // 数据域
struct StackNode *next; // 指针域
} StackNode, *LinkStackPtr;

2.链栈初始化(即创建一个空栈)

1
2
3
void InitStack(LinkStackPtr *top) {
*top = NULL;
}

3.判断栈是否为空(若为空则返回 1,否则返回 0)

1
2
3
int IsEmpty(LinkStackPtr top) {
return top == NULL;
}

4.进栈(将元素 x 压入栈顶)

1
2
3
4
5
6
void Push(LinkStackPtr *top, int x) {
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode)); // 为新元素分配内存空间
p->data = x; // 将元素 x 压入栈顶
p->next = *top; // 将新元素插入链表的头部
*top = p;
}

5.出栈(删除栈顶元素并返回其值)

1
2
3
4
5
6
7
8
9
10
11
12
int Pop(LinkStackPtr *top) {
if (IsEmpty(*top)) { // 栈空,返回空值
printf("Stack is empty!\n");
return -1;
} else {
LinkStackPtr p = *top; // 备份栈顶指针
int x = p->data; // 取出栈顶元素
*top = p->next; // 删除栈顶结点
free(p); // 释放栈顶结点的存储空间
return x; // 返回栈顶元素的值
}
}

6.获取栈顶元素

1
2
3
4
5
6
7
8
int GetTop(LinkStackPtr top) {
if (IsEmpty(top)) { // 栈空,返回空值
printf("Stack is empty!\n");
return -1;
} else {
return top->data; // 返回栈顶元素的值
}
}

7.输出链栈中的元素

1
2
3
4
5
6
7
8
9
10
11
12
void PrintStack(LinkStackPtr top) {
if (IsEmpty(top)) { // 栈空,返回空值
printf("Stack is empty!\n");
} else {
printf("Stack elements: ");
while (top != NULL) {
printf("%d ", top->data);
top = top->next;
}
printf("\n");
}
}
Contents
  1. 1. 链栈
    1. 1.1. 1.链栈结构定义
    2. 1.2. 2.链栈初始化(即创建一个空栈)
    3. 1.3. 3.判断栈是否为空(若为空则返回 1,否则返回 0)
    4. 1.4. 4.进栈(将元素 x 压入栈顶)
    5. 1.5. 5.出栈(删除栈顶元素并返回其值)
    6. 1.6. 6.获取栈顶元素
    7. 1.7. 7.输出链栈中的元素
|