说明

  • 作为栈顶的节点不存储数据,仅作定位功能
  • 数据项的类型可自行定义
  • 在push和pop时,并不改变栈顶节点的位置,仅仅是将待操作节点加入或删除并改变指针指向而已
  • 栈顶节点的数据项可用来存储当前栈的节点数,这点在push函数的定义中可以体现
  • 主函数仅作各函数的演示使用,可自定义

定义相应结构

1
2
3
4
typedef struct node{
int data;
struct node *next;
}node;

该结构由一个整型和一个指向此结构的指针组成。

定义push函数

1
2
3
4
5
6
7
8
9
int push(node *top, int data){
node *temp = (node *)malloc(sizeof(node));
temp->data = data;
temp->next = top->next;
top->next = temp;
top->data++;

return data;
}
  • 第一步:分配空间
  • 第二步:存储数据
  • 第三步:改变栈顶和新增项的next指针,递增top节点的data项

定义pop函数

1
2
3
4
5
6
7
8
9
10
11
12
13
int pop(node *top){
if(!top->next){
printf("Stack is empty now.");
return -1;
}
int pop_data = top->next->data;
node *temp = top->next;
top->next = top->next->next;
temp = NULL;
free(temp);

return pop_data;
}
  • 第一步:判断栈是否为空
  • 第二步:定义变量存储待弹出的数据和待删除节点
  • 第三步:改变栈顶的next指针
  • 释放待删除节点空间,删除节点

定义初始化函数

  • 为栈顶节点分配空间并初始化指针为空
1
2
3
4
5
6
7
node* stack_init(){
node *temp = (node *)malloc(sizeof(node));
temp->data = 0;
temp->next = NULL;

return temp;
}

定义遍历显示函数

1
2
3
4
5
6
7
void display(node *current){
current = current->next;
while(current){
printf("%d\n",current->data);
current = current->next;
}
}
  • 将当前节点指向栈顶的下一个节点
  • 当前节点不为空时进入遍历循环
  • 打印当前节点的数据项
  • 将当前节点指向下一个节点

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
int data;
struct node *next;
}node;

int push(node *top, int data);
int pop(node *top);
node* stack_init();
void display(node *current);

int push(node *top, int data){
node *temp = (node *)malloc(sizeof(node));
temp->data = data;
temp->next = top->next;
top->next = temp;

return data;
}

int pop(node *top){
if(!top->next){
printf("Stack is empty now.");
return -1;
}
int pop_data = top->next->data;
node *temp = top->next;
top->next = top->next->next;
temp = NULL;
free(temp);

return pop_data;
}

node* stack_init(){
node *temp = (node *)malloc(sizeof(node));
temp->data = 0;
temp->next = NULL;

return temp;
}

void display(node *current){
current = current->next;
while(current){
printf("%d\n",current->data);
current = current->next;
}
}

int main(){
int first_input;
int pop_input, pop_data;
node *top = stack_init();
int status;

printf("Enter strings, Ctrl+Z to quit.\n");
status = scanf("%d",&first_input);
while(status!=EOF){
push(top, first_input);
status = scanf("%d",&first_input);
}
display(top);

printf("Now enter 1 to pop data, 0 to quit.\n");
scanf("%d",&pop_input);
while(pop_input==1){
pop_data = pop(top);
if(pop_data==-1){
break;
}
printf("pop_data: %d\n",pop_data);
scanf("%d",&pop_input);
}

printf("\nDone\n");

return 0;
}

评论