链栈
来源:互联网 发布:排序java 编辑:程序博客网 时间:2024/06/11 01:57
//链栈.cpp :定义控制台应用程序的入口点。
// 作者RicardoMTan
#include"stdafx.h"
#include"malloc.h"
typedefintDataType;
typedefstructStackNode{
DataTypedata; //数据域
structStackNode *next; //指针域
}StackNode; //栈数据类型
typedefstructLinkStack{
StackNode*top; //链栈指针域
}LinkStack; //链栈数据类型
/*初始化栈*/
StackNode*InitStack(LinkStack *s){
returns->top=NULL;
}
/*判断栈是否为空*/
boolStackEmpty(LinkStack *s){
return (s->top==NULL);
}
/*进栈*/
voidPush(LinkStack *s){
DataTypeargment;
printf("输入进栈元素:");
scanf_s("%d",&argment);
StackNode*p = (StackNode *)malloc(sizeof(StackNode));
p->data = argment;
p->next =s->top;
s->top= p;
}
/*输出栈元素*/
voidDisplay(LinkStack *s){
StackNode*p =s->top; //为了不改变栈顶指针(s->top)的指向,定义另一个指针来访问
if(StackEmpty(s)){
printf("Stackunder flow!\n");
}
else{
printf("栈元素集合为: ");
while(p !=NULL)
{
printf("%d ",p->data);
p = p->next; //p指针下移
}
printf("\n");
}
}
/*求栈长*/
intGetLength(LinkStack *s){
int count =0;//计数器
StackNode*p =s->top;
if(StackEmpty(s)){
printf("Stackunder flow!\n");
returncount;
}
else{
while(p !=NULL){
count++;
p = p->next;
}
returncount;
}
}
/*出栈*/
DataTypePop(LinkStack *s){
DataTypee;
StackNode*p =s->top;
if(StackEmpty(s)){
printf("Stackunder flow!\n");
return0;
}
else{
e = p->data;
s->top= p->next;
free(p);
printf("出栈元素为:%d\n", e);
returne;
}
}
/*获取栈顶元素*/
DataTypeStackGetTop(LinkStack *s){
if(StackEmpty(s)){
printf("Stackunder flow!\n");
return0;
}
else{
returns->top->data;
}
}
/*释放栈*/
voidDestoryStack(LinkStack *&s){
StackNode*p =s->top->next;
while (s->top!=NULL){
free(s);
s->top= p;
s->top=s->top->next;
}
free(s);
}
/*控制函数*/
intOperate(LinkStack *s){
InitStack(s);
int flag =0;
printf("\t\t\t-------------------\n");
printf("\t\t\t1-进栈\n");
printf("\t\t\t2-输出栈元素\n");
printf("\t\t\t3-获取栈顶元素\n");
printf("\t\t\t4-出栈\n");
printf("\t\t\t5-返回栈长\n");
printf("\t\t\t0-退出\n");
printf("\t\t\t-------------------\n");
printf("\t\t\t\t\t\t输入指令:");
scanf_s("%d",&flag);
while(flag!=0){
switch(flag){
case0:
break;
case1:
Push(s);
break;
case2:
Display(s);
break;
case3:
if(GetLength(s) == 0)
printf("栈为空!\n");
else
printf("栈顶元素为:%d\n", StackGetTop(s));
break;
case4:
Pop(s);
break;
case5:
if(GetLength(s)==0)
printf("栈为空!\n");
else
printf("栈长为:%d\n", GetLength(s));
break;
}
printf("\t\t\t\t\t\t输入指令:");
scanf_s("%d",&flag);
}
return 0;
}
intmain(){
LinkStack*s;
s = (LinkStack*)malloc(sizeof(LinkStack));
Operate(s);
return 0;
}