把栈的基本操作写成了一个小小的子系统,仅供参考
/*
栈结构的栈底元素的next域为空 栈顶的next域指向第二个元素位置
*/
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct stacknode // 定义栈节点结构
{
datatype data;
struct stacknode*next;
}stacknode;
typedef struct // 定义栈链结构
{
struct stacknode * top;
}linkstack;
linkstack *s = NULL;
linkstack *initstack(linkstack *s) // 置空栈
{
s = (linkstack *)malloc(sizeof(linkstack));
s->top = NULL;
return s;
}
void push(linkstack *s, datatype x) // 入栈
{
stacknode *p;
p = (stacknode *)malloc(sizeof(stacknode));
p->data = x;
p->next = s->top; // 指向下一节点 相当于自增
s->top = p;
}
void pop(linkstack *s) // 出栈
{
if (s->top == NULL)
{
printf("请先入栈\n");
return ;
}
//栈结构的栈底元素的next域为空 栈顶的next域指向第二个元素位置
stacknode *p;
p = s->top; //指向栈顶
s->top = p->next; // 修改栈顶指针
printf("当前栈顶元素 %c 已出\n",p->data);
free(p);
}
void show(linkstack *s) //显示栈
{
if (s->top == NULL)
{
printf("请先入栈\n");
return ;
}
stacknode *p;
p = s->top;
printf("栈顶到栈底元素为:");
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
while (1)
{
printf("*********************************\n");
printf("*\t 1\t置空栈\t\t*\n");
printf("*\t 2\t入栈\t\t*\n");
printf("*\t 3\t出栈\t\t*\n");
printf("*\t 4\t显示栈\t\t*\n");
printf("*\t 5\t销毁栈\t\t*\n");
printf("*\t 0\t返回\t\t*\n");
printf("*********************************\n");
printf("请输入一个数字\n");
int i;
scanf("%d",&i);
getchar();
if (i == 1)
{
s = initstack(s);
printf("栈已创建\n");
}
else if (i == 2)
{
if (s == NULL)
{
printf("先创建栈\n");
continue;
}
printf("请输入一个元素以#结束\n");
datatype x;
scanf("%c",&x);
getchar();
while (x != '#')
{
push(s,x);
printf("请输入一个元素以#结束\n");
scanf("%c",&x);
getchar();
}
printf("入栈成功\n");
}
else if (i == 3) // 出栈
{
if (s == NULL)
{
printf("请先建栈\n");
continue;
}
pop(s);
}
else if (i == 4) //显示栈
{
if (s == NULL)
{
printf("请先建栈\n");
continue;
}
show(s);
}
else if (i == 5) // 销毁栈
{
if (s == NULL)
{
printf("请先建栈\n");
continue;
}
free(s); //释放s意思是释放s所指的空间,s还存在
s = NULL; // 将s指向NULL;
printf("栈已销毁\n");
}
else if (i == 0)
{
return 0;
}
else
printf("你输入的数字有误\n");
}
return 0;
}