花一个晚上写了栈的顺序存储与链式存储,实现了一些对栈的基本操作,今天就写到这里了,呵呵。。。以后再加上栈的应用
#include <stdio.h>
#include <stdlib.h>
typedef char DateType;
typedef struct node
{
DateType data;
struct node* next;
}LinkStack;
LinkStack *top;
void InitStack()
{
top=(LinkStack*)malloc(sizeof(LinkStack));
top->next=NULL;
top->data=0;
printf("\n\t\t\t初始化链栈成功!");
}
void push(DateType x)
{
LinkStack* s; //注意不要把s定义为全局变量
s=(LinkStack*)malloc(sizeof(LinkStack));
s->data=x;
s->next=top;
top=s;
printf("\n\t\t\t入栈成功!");
}
void pop()
{
LinkStack* s;
s=top;
if(s==NULL)
{
printf("\n\t\t\t栈为空!");
}
else
{
top=s->next;
free(s);
printf("\n\t\t\t出栈成功");
}
}
void readTop()
{
if(top==NULL)
{
printf("\n\t\t\t栈为空!");
}
else
{
printf("\n\t\t\t栈顶元素为:%c",top->data);
}
}
void lenStack()
{
int i=0;
LinkStack* s;
s=top;
if(s==NULL)
{
printf("\n\t\t\t栈为空!");
}
else
{
while(s!=NULL)
{
i++;
s=s->next;
}
printf("\n\t\t\t链栈长度为:%d",i);
}
}
void showStack()
{
LinkStack* s;
s=top;
if(s==NULL)
{
printf("\n\t\t\t栈为空!");
}
else
{
printf("\n\t\t\t链栈元素为:\n");
printf("\t\t\t");
while(s!=NULL) //遍历时注意不要用top,不然第二次遍历时top移动到最后一个元素之后了
{
printf("%c\t",s->data);
s=s->next;
}
}
}
void main()
{
int i,j;
DateType x;
while(j)
{
printf("\n\n\n\n");
printf("\n\t\t\t*************************************");
printf("\n\t\t\t*** 1---创建链栈 ***");
printf("\n\t\t\t*** 2---入栈 ***");
printf("\n\t\t\t*** 3---出栈 ***");
printf("\n\t\t\t*** 4---读栈顶元素 ***");
printf("\n\t\t\t*** 5---链栈长度 ***");
printf("\n\t\t\t*** 6---显示链栈元素 ***");
printf("\n\t\t\t*** 0---退出 ***");
printf("\n\t\t\t*************************************\n");
printf("\n\t\t\t请选择菜单号(0---6):");
scanf("%d",&i);getchar();
if(i==1)
{
InitStack();
}
else if(i==2)
{
if(top==NULL)
{
printf("\n\t\t\t请先初始化链表!");
}
else
{
printf("\n\t\t\t请输入要入栈的元素:");
scanf("%c",&x);
push(x);
}
}
else if(i==3)
{
pop();
}
else if(i==4)
{
readTop();
}
else if(i==5)
{
lenStack();
}
else if(i==6)
{
showStack();
}
else if(i==0)
{
j=0;
printf("\n\t\t\t程序结束\n");
}
}
}