链栈
1.链栈结构定义
typedef int LSTDataType;
typedef struct StackNode {
LSTDataType data; // 数据域
struct StackNode *next; // 指针域
} StackNode, *LinkStackPtr;
2.链栈初始化(即创建一个空栈)
void InitStack(LinkStackPtr *top) {
*top = NULL;
}
3.判断栈是否为空(若为空则返回 1,否则返回 0)
int IsEmpty(LinkStackPtr top) {
return top == NULL;
}
4.进栈(将元素 x 压入栈顶)
void Push(LinkStackPtr *top, int x) {
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode)); // 为新元素分配内存空间
p->data = x; // 将元素 x 压入栈顶
p->next = *top; // 将新元素插入链表的头部
*top = p;
}
5.出栈(删除栈顶元素并返回其值)
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.获取栈顶元素
int GetTop(LinkStackPtr top) {
if (IsEmpty(top)) { // 栈空,返回空值
printf("Stack is empty!\n");
return -1;
} else {
return top->data; // 返回栈顶元素的值
}
}
7.输出链栈中的元素
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");
}
}