链栈:
有两种做法,一种是函数不返回指针,但是需要运用二重指针。另一种就是有返回值的函数,此处采用的是返回指针的做法。
函数:
构造链栈
//构造栈
LinkStack InitStack(LinkStack S)
{
S = NULL;
return S;
}
压入栈
//压入栈
LinkStack Push(LinkStack S, ElementType* e)
{
LinkStack p;
p = (LinkStack)malloc(sizeof(StackNode));
p->data=*e; //赋值
p->next=S; //压入栈顶
S=p;
return S;
}
弹出栈
//弹出栈
LinkStack Pop(LinkStack S, ElementType* e)
{
LinkStack p;
if (S == NULL) return ERROR;
*e = S->data;
p = S;
S = S->next;
free(p);
return S;
}
取栈顶元素
//取栈顶元素
void GetTop(LinkStack S, ElementType* e)
{
if (S!=NULL)
*e = S->data;
}
调用压入栈函数
//调用压入栈函数
LinkStack Push_Stack(LinkStack S)
{
int num, e;
printf("请输入入栈元素个数:\n");
scanf("%d", &num);
printf("请输入入栈元素:\n");
for (int i=0; i<num; i++)
{
scanf("%d", &e);
S = Push(S,&e);
printf("%d已入栈\n", e);
}
return S;
}
调用弹出栈函数
//调用弹出函数
LinkStack Pop_Stack(LinkStack S)
{
int num, e;
printf("请输入出栈元素个数:\n");
scanf("%d", &num);
for (int i=0; i<num; i++)
{
if (S != NULL)
{
S = Pop(S,&e);
printf("%d已出栈\n", e);
}
else {
printf("栈已空\n");
break; }
}
return S;
}
调用取栈顶元素函数
//调用取栈顶元素函数
void GetTop_Stack(LinkStack S)
{
int e, flag;
if (S != NULL)
{
GetTop(S,&e);
printf("栈顶元素为%d\n", e);
}
else printf("栈已空\n");
}
菜单
//菜单
void menu()
{
printf("********1.入栈 2.出栈*********\n");
printf("********3.取栈顶 4.退出*********\n");
}
主函数
//主函数
int main()
{
int n;
LinkStack S;
S = InitStack(S);
while (1)
{
menu();
scanf("%d", &n);
switch(n)
{
case 1: S = Push_Stack(S); break;
case 2: S = Pop_Stack(S); break;
case 3: GetTop_Stack(S); break;
case 4: exit(OVERFLOW);
}
}
return 0;
}
完整代码
#include <Stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define ERROR 0
#define OVERFLOW -1
#define Status int
#define OK 1
#define ElementType int
typedef struct StackNode{
ElementType data;
struct StackNode *next;
}StackNode, *LinkStack;
//构造栈
LinkStack InitStack(LinkStack S)
{
S = NULL;
return S;
}
//压入栈
LinkStack Push(LinkStack S, ElementType* e)
{
LinkStack p;
p = (LinkStack)malloc(sizeof(StackNode));
p->data=*e; //赋值
p->next=S; //压入栈顶
S=p;
// printf("%d\n", S->data);
return S;
}
//弹出栈
LinkStack Pop(LinkStack S, ElementType* e)
{
LinkStack p;
if (S == NULL) return ERROR;
*e = S->data;
// printf("S->data 的值是 %d\n", S->data);
// printf("e 的值是 %d\n", *e);
p = S;
S = S->next;
free(p);
return S;
}
//取栈顶元素
void GetTop(LinkStack S, ElementType* e)
{
if (S!=NULL)
*e = S->data;
}
//调用压入栈函数
LinkStack Push_Stack(LinkStack S)
{
int num, e;
printf("请输入入栈元素个数:\n");
scanf("%d", &num);
printf("请输入入栈元素:\n");
for (int i=0; i<num; i++)
{
scanf("%d", &e);
S = Push(S,&e);
// printf("S->data 的值是 %d\n", S->data);
printf("%d已入栈\n", e);
}
return S;
}
//调用弹出函数
LinkStack Pop_Stack(LinkStack S)
{
int num, e;
printf("请输入出栈元素个数:\n");
scanf("%d", &num);
for (int i=0; i<num; i++)
{
if (S != NULL)
{
S = Pop(S,&e);
printf("%d已出栈\n", e);
}
else {
printf("栈已空\n");
break; }
}
return S;
}
//调用取栈顶元素函数
void GetTop_Stack(LinkStack S)
{
int e, flag;
// printf("%d", S);
if (S != NULL)
{
// printf("123\n");
GetTop(S,&e);
printf("栈顶元素为%d\n", e);
}
else printf("栈已空\n");
}
//菜单
void menu()
{
printf("********1.入栈 2.出栈*********\n");
printf("********3.取栈顶 4.退出*********\n");
}
//主函数
int main()
{
int n;
LinkStack S;
S = InitStack(S);
while (1)
{
menu();
scanf("%d", &n);
switch(n)
{
case 1: S = Push_Stack(S); break;
case 2: S = Pop_Stack(S); break;
case 3: GetTop_Stack(S); break;
case 4: exit(OVERFLOW);
}
}
return 0;
}