#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR -1;
typedef int Position;
typedef int ElemType;
//C语言实现链栈如下
typedef struct SNode {
ElemType Data;//数据域
struct SNode* next;//指针域
}*PtrToSNode;
typedef PtrToSNode Stack;
typedef enum {
false,
true
}bool;
//1.链栈的初始化
Stack CreateStack() {
//构建一个堆栈的头节点分配空间
Stack S = malloc(sizeof(struct SNode));
S->next = NULL;
//S->Data = NULL;//因为是带头节点,数据域无所谓赋值
return S;//将这个头节点返回
}
//判断栈空
bool isEmpty(Stack S) {
/*判断堆栈S是否空,是反回true,反之false*/
return (S->next == NULL);
}
//元素X入栈Push
bool Puse(Stack S, Position X) {
/*注意和栈的顺序存储实现不同的是,链栈不用判断栈是否满不满,
因为其在不断申请空间,而数组是固定的要判断空间是否满不满*/
PtrToSNode TempNode;//创建一个中间节点,分配空间
TempNode = (PtrToSNode)malloc(sizeof(struct SNode));
TempNode->Data = X;
TempNode->next = S->next;
S->next = TempNode;
return true;
}
//元素出栈并反回栈顶元素
ElemType Pop(Stack S) {
/*栈的链式存储结构(链栈)与单链表类似,但其操作受限,插入和删除操作只能在链栈的栈顶进行。
栈顶指针Top就是链表的头指针*/
PtrToSNode FirstNode;
ElemType TopElem;
if (isEmpty(S)) {
printf("栈堆空");
return ERROR;//ERROR 为ElemType的特殊值,标志错误
}
else {
FirstNode= S->next;//先将要删除的栈顶节点赋给FirstNode
TopElem = FirstNode->Data;
S->next = FirstNode->next;
free(FirstNode);
return TopElem;
}
}
int SNodeLine(Stack S){
int cnt=0;
Stack temp=S;
temp=temp->next;
while(temp){
cnt++;
temp=temp->next;
}
return cnt;
}
int main()
{
Stack s=CreateStack();
//压入元素
int i;
for (i = 0; i < 10; i++) {
Puse(s, i);
}
printf("入栈元素个数:");
printf("%d\n",SNodeLine(s));
Stack temp=s;
for(i=0;i<10;i++){
temp=temp->next;
printf("%d\t",temp->Data);
}
printf("\n");
for (i = 0; i < 10; i++) {
int Elem = Pop(s);
printf("%d\t", Elem);
}
return 0;
}
栈的链式存储结构基本实现
于 2022-03-22 11:30:52 首次发布