我们在链表的基础上实现栈,主要有以下操作
入栈
- 出栈
- 取栈顶元素
- 初始化
- 销毁**
相关的代码实现的过程如下
1、数据结构
6 typedef char LinkStackType;
7 typedef struct LinkNode{
8 LinkStackType data;
9 struct LinkNode* next;//只有一个指针指向下一个元素,单向链表
10 }LinkNode;
11 typedef struct LinkStack{
12 LinkNode head;
13 }LinkStack;
2、初始化
void LinkStackInit(LinkStack* stack){
4 if(stack==NULL){
5 return;
6 }
7 stack->head.data='\0';
8 stack->head.next=NULL;
9 }
10
3、销毁
void LinkStackDestroy(LinkNode* stack)//销毁栈
12 {
13 free(stack);
14 stack=NULL;
15 }
16
4、打印函数
void LinkStackPrint(LinkStack* stack,const char* msg)
18 {
19 printf("[%s]\n",msg);
20 LinkNode* cur=stack->head.next;
21 for(;cur!=NULL;cur=cur->next){
22 printf("[%c|%p]",cur->data,cur);
23 }
24 printf("\n");
25 }
5、创造新的结点
LinkNode* CreateNode(LinkStackType value)
27 {
28 LinkNode* newnode=(LinkNode*)malloc(sizeof(LinkNode));
29 newnode->data=value;
30 newnode->next=NULL;
31 return newnode;
32 }
7、入栈操作
void LinkStackPush(LinkStack* stack,LinkStackType value)//入栈
35 {
36 if (stack==NULL){
37 return;
38 }
39 LinkNode* newnode=CreateNode(value);
40 newnode->next=stack->head.next;
41 stack->head.next=newnode;
42
43 }
8、出栈操作
void LinkStackPop(LinkStack* stack)
45 {
46 if(stack==NULL){
47 return;
48 }
49 LinkNode* to_delete=stack->head.next;
50 stack->head.next=to_delete->next;
51 LinkStackDestroy(to_delete);
52 }
53
9、取栈顶元素
int LinkStackTop(LinkStack* stack,LinkStackType* value)//取栈顶元素
55 {
56 if(stack==NULL || value==NULL){
57 return 0;
58 }
59 if(stack->head.next=='\0'){
60 return 0;
61 }
62 *value=stack->head.next->data;
63 return *value;
64 }