一:基本操作代码如下:
链式栈和带头结点的单链表很像,只是栈要遵循“先进后出”的基本原则,而且只能在一端进行插入和删除操作。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Link_StackNode
{
ElemType data;//数据域
struct Link_StackNode* next;//指针域
} Link_StackNode, * LinkStack;
//初始化
bool Init_LinkStack(LinkStack& top) {
top = (Link_StackNode*)malloc(sizeof(Link_StackNode));
if (top == NULL) return false;
top->next = NULL;//设置栈顶指针为空
return true;
}
//判空
bool LinkedStack_Empty(LinkStack top) {
if (top->next == NULL) return true;
else return false;
}
//入栈
bool Push_LinkStack(LinkStack& top, ElemType x) {
LinkStack p = (Link_StackNode*)malloc(sizeof(Link_StackNode));
if (p == NULL) { //申请新结点空间失败
return false;
}
else {
p->data = x;
p->next = top;
top = p; //让头结点指针城指向新的栈顶元素
printf("%d ", x);
return true;
}
}
//求栈长,即存放了几个元素(和单链表求表长几乎一个道理)
int Length_LinkedStack(LinkStack top) {
int count = 0;
while (top->next != NULL) {
top = top->next;
count++;
}
return count;
}
//出栈
bool Pop_LinkStack(LinkStack& top, ElemType& x) {
if (top == NULL) {//判空
return false;
}
else {
Link_StackNode* p = top; //定义一个新结点
x = p->data; //将原来栈顶数据元素存放至新结点空间
top = p->next; //top指向下一个结点
free(p); //释放新结点所占的空间
return true;
}
}
//取栈顶元素
int GetTop_LinkStack(LinkStack top)
{
if (top->next == NULL) return 0;
return top->next->data;
}
//打印栈中元素
void Printf_LinkStack(LinkStack top) {
LinkStack p = top;
while (p->next) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//主函数
int main() {
LinkStack top;
Init_LinkStack(top);
printf("请输入一系列元素如11 22 33 44 55 -1且以-1结束:\n");
int x;
scanf_s("%d", &x);
while (x != -1) {
Push_LinkStack(top, x);
scanf_s("%d", &x);
}
printf("\n");
int len= Length_LinkedStack(top);
printf("栈的长度为:%d\n",len);
printf("打印栈中元素:\n");
Printf_LinkStack(top);
return 0;
}