C语言 出栈操作Pop(struct SqStack * MyStack, ElemType *e

C语言 出栈操作Pop(struct SqStack * MyStack, ElemType *e),将栈顶元素出栈,出栈元素值由参数e带出,同时修改栈的相关值。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define elemType int /* 链栈元素数据类型 */
#define SNODE_SIZE sizeof (struct sNode) /* 链栈结点空间大小 */

#define status int /* 状态型变量 */
#define OVERFLOW -1 /* 内存溢出状态码 */
#define ERROR 0 /* 错误状态码 */
#define OK 1 /* 正确状态码 */

/* 链栈结点存储结构 */
typedef struct sNode {
elemType data;
struct sNode *next;
} sNode, *sNodePtr;

/* 链栈存储结构 */
typedef struct linkStack {
sNodePtr top; /* 栈顶指针 */
} linkStack;

/* 初始化 */
/* 操作结果:构造一个带头结点的空链栈S */
void initStack (linkStack *S) {
S->top = (sNodePtr) malloc (SNODE_SIZE); /* 产生头结点,栈顶指针指向此头结点 */
if (!S->top) /* 内存分配失败 */
exit (OVERFLOW);
S->top->next = NULL;
}

/* 销毁 */
/* 初始条件:链栈S已存在。操作结果:销毁链栈S */
void destroyStack (linkStack *S) {
sNodePtr p, q;

p = S->top; /* p指向S的头结点 */
while (p) {
q = p->next; /* q指向p的下一个结点 */
free (p); /* 回收p指向的结点 */
p = q; /* p移动到下一个结点 */
} /* 直到没有下一个结点 */
}

/* 判断链栈是否为空 */
/* 初始条件:链栈S已存在。操作结果:若S为空链栈,则返回TRUE,否则返回FALSE */
status stackIsEmpty (linkStack *S) {
return S->top->next == NULL;
}

/* 入栈 */
/* 操作结果:在S的栈顶插入新的元素e */
status push (linkStack *S, elemType e) {
sNodePtr p;

p = (sNodePtr) malloc (SNODE_SIZE); /* 产生新结点 */
if (!p) /* 内存分配失败 */
exit (OVERFLOW);

p->data = e;
p->next = S->top->next; /* 将新结点链接到原栈顶 */
S->top->next = p; /* 栈顶指向新结点 */
}

/* 出栈 */
/* 操作结果:删除S的栈顶元素,并由e返回其值 */
status pop (linkStack *S, elemType *e) {
sNodePtr p;

if (stackIsEmpty (S))
return ERROR;

p = S->top->next; /* p指向链栈的第一个结点 */
*e = p->data; /* 取出数据 */
S->top->next = p->next;
free (p); /* 删除该结点 */

    if (S->top == p) /* 栈为空 */
     S->top->next = NULL;
    
    return OK;
}

/* 打印栈内容 */
/* 初始条件:链栈S已存在。操作结果:当栈不为空时,打印栈内容并返回OK,否则返回ERROR */
status printStack (linkStack *S) {
sNodePtr p;

if (stackIsEmpty (S)) {
puts ("The stack is empty! ");
return ERROR;
}

p = S->top->next;
while (p) {
printf ("%d\t", p->data);
p = p->next;
}
putchar ('\n');

return OK;
}

int main (void) {
linkStack S;
elemType e; 
elemType a, b, c, d;

a = 1; b = 2; c = 3; d = 4;

initStack (&S);
push (&S, a);
push (&S, b);
push (&S, c);
push (&S, d);

puts ("Push 4 elements");
printf ("S:\t");
printStack (&S);
putchar ('\n');

pop (&S, &e);
puts ("Pop 1 element");
printf ("S:\t");
printStack (&S);

destroyStack (&S);

getch (); /* 屏幕暂留 */
return 0;
}

如有问题,可以点击头像联系我

温馨提示:答案为网友推荐,仅供参考
相似回答