题目
用不带头结点的单链表存储链栈,设计初始化栈、判断栈是否为空、进栈和出栈等相应算法。
分析
不带头结点的单链表L为空的条件是L==NULL,进栈和出栈操作都是在表头进行的。
入栈
出栈
代码
核心代码:
/* 初始化栈 */
/* *&list指的是要初始化的栈 */
void initStack(LNode *&list) { // list要改变,所以要用引用型
list=NULL;// 将开始结点置为NULL
}
/* 判断是否栈空,如果栈空返回1,否则返回0 */
/* *list指的是要进行判断的链栈 */
int isEmpty(LNode *list) {
if(list==NULL) { // 栈空状态:list==NULL
return 1;
} else {
return 0;
}
}
/* 入栈 */
/* *list指的是要入栈操作的链栈;x指的是要新入栈的元素的data值 */
void push(LNode *&list,int x) {
/* 申请新的进栈结点 */
LNode *newNode;// 定义链栈结点
newNode=(LNode *)malloc(sizeof(LNode)); // 申请新结点
newNode->data=x;// 设置新结点的数据
newNode->next=list;// 设置新结点的next指向原开始结点(栈顶结点)
list=newNode; // 将新结点设置为栈顶结点
}
/* 出栈 */
/* *list指的是要出栈的链栈;&x指的是出栈元素的data值 */
int pop(LNode *&list,int &x) {
LNode *temp;// 定义一个临时变量用来保存栈顶结点
if(list==NULL) {// 判断是否栈空
return 0;// 如果栈空返回0
} else {
temp=list;// 临时保存开始结点
x=temp->data;// 保存要出栈结点的data值
list=temp->next;// 将出栈结点的下一个结点置为栈顶结点
free(temp);// 释放结点资源
return 1;// 出栈成功返回1
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define maxSize 20
/* 链栈结点定义 */
typedef struct LNode {
int data; // 数据域
struct LNode *next;// 指针域
} LNode;
/* 初始化栈 */
/* *&list指的是要初始化的栈 */
void initStack(LNode *&list) { // list要改变,所以要用引用型
list=NULL;// 将开始结点置为NULL
}
/* 判断是否栈空,如果栈空返回1,否则返回0 */
/* *list指的是要进行判断的链栈 */
int isEmpty(LNode *list) {
if(list==NULL) { // 栈空状态:list==NULL
return 1;
} else {
return 0;
}
}
/* 入栈 */
/* *list指的是要入栈操作的链栈;x指的是要新入栈的元素的data值 */
void push(LNode *&list,int x) {
/* 申请新的进栈结点 */
LNode *newNode;// 定义链栈结点
newNode=(LNode *)malloc(sizeof(LNode)); // 申请新结点
newNode->data=x;// 设置新结点的数据
newNode->next=list;// 设置新结点的next指向原开始结点(栈顶结点)
list=newNode; // 将新结点设置为栈顶结点
}
/* 出栈 */
/* *list指的是要出栈的链栈;&x指的是出栈元素的data值 */
int pop(LNode *&list,int &x) {
LNode *temp;// 定义一个临时变量用来保存栈顶结点
if(list==NULL) {// 判断是否栈空
return 0;// 如果栈空返回0
} else {
temp=list;// 临时保存开始结点
x=temp->data;// 保存要出栈结点的data值
list=temp->next;// 将出栈结点的下一个结点置为栈顶结点
free(temp);// 释放结点资源
return 1;// 出栈成功返回1
}
}
/* 打印链栈 */
/* list指的是要被打印的链栈 */
void printStack(LNode *list) {
LNode *temp=list;
printf("\n");
while(temp!=NULL) {
printf("%d\t",temp->data);
temp=temp->next;
}
printf("\n");
}
int main() {
LNode *list;
int x;
initStack(list);// 初始化栈
/* 入栈 */
push(list,1);// 将1入栈
push(list,2);// 将2入栈
push(list,3);// 将3入栈
push(list,4);// 将4入栈
push(list,5);// 将5入栈
printStack(list);// 打印入栈成功的链栈
/* 判断栈空 */
printf("是否栈空(1表示栈空,0表示非空):%d\n",isEmpty(list));
/* 出栈 */
/* 第一次出栈 */
pop(list,x);// 将栈顶元素出栈
printf("出栈元素:%d",x);// 打印出栈的元素
printStack(list);// 打印剩下的链栈元素
/* 第二次出栈 */
pop(list,x);// 将栈顶元素出栈
printf("出栈元素:%d",x);// 打印出栈的元素
printStack(list);// 打印剩下的链栈元素
/* 第三次出栈 */
pop(list,x);// 将栈顶元素出栈
printf("出栈元素:%d",x);// 打印出栈的元素
printStack(list);// 打印剩下的链栈元素
return 0;
}
结果如下: