跨年了,祝大家新年快乐!!!有多少人还在写代码呢?
链栈:我是以链尾为栈底,链头为栈顶,采用头插法入栈,当然并非这一种做法。
见代码(有注释):
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
typedef int Status;
typedef struct Node{
int data; //结点的数据域
struct Node *next; //结点的指针域
}Node,*LinkList;
//*******************************************//
// 链式(单链表——带头结点,也可不带表头)实现栈处理时,规定
// 1、将单链表的最后一个元素的next指针(值为NULL)设为栈底;
// 2、头结点指向的数据为栈顶元素
// 3、当栈顶指针为空时,则栈空
//*******************************************//
void ShowMenu()
{
printf("\n");
printf("\n****************链栈基本操作****************\n\n");
printf("\t\t1 数据入栈\n");
printf("\t\t2 数据出栈\n");
printf("\t\t3 读取栈顶元素\n");
printf("\t\t4 读取栈中所有元素\n");
printf("\t\t5 清除栈中数据\n");
printf("\t\t0 退出系统\n");
printf("\n****************链栈基本操作****************\n\n");
printf("\n");
}
//功能:带表头的链栈初始化
Status Init_Stack(LinkList &S)
{
S = (LinkList)malloc(sizeof(Node));
if(!S)
return ERROR;
S->next = NULL;
return OK;
}
//功能:入栈操作
Status Push_Stack(LinkList &S,int e)
{
LinkList p = (LinkList)malloc(sizeof(Node));
if(!p)
return ERROR;
p->data = e;
p->next = S->next;
S->next = p;
return OK;
}
//功能:出栈操作
Status Pop_Stack(LinkList &S)
{
LinkList p = S->next;
if(!p)
return ERROR;
S->next = p->next;
free(p);
return OK;
}
//功能:取栈顶元素
int Top_Stack(LinkList S)
{
LinkList p = S->next;
if(!p)
return ERROR;//万一出栈的就是-1呢,所以不一定return ERROR
return p->data;
}
//功能:输出栈中所有元素
Status All_Stack(LinkList S)
{
int i = 0;
LinkList p = S->next;
if(!p)
return ERROR;
while(p)
{
printf("第%d个元素为:%d\n",++i,p->data);
p = p->next;
}
return OK;
}
//清空栈
Status Clear_Stack(LinkList &S)
{
LinkList p = S->next;
if(!p)
return ERROR;
while(p)
{
LinkList q = p;
p = p->next;
free(q);
}
//最后这一步,切记不可忘
S->next = NULL;
return OK;
}
int main()
{
int num;
LinkList S;
int choice;
if(Init_Stack(S) ==ERROR)
exit(0);
while(1)
{
ShowMenu();
printf("Which is your choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入入栈元素:\n");
scanf("%d",&num);
if(Push_Stack(S,num)==OK)
printf("数据入栈成功!\n");
getchar();getchar();
system("cls");
break;
case 2:
if(Pop_Stack(S)==ERROR)
printf("栈空,无法出栈!\n");
else
printf("出栈成功!\n");
getchar();getchar();
system("cls");
break;
case 3:
if(Top_Stack(S)==ERROR)
printf("栈空,无法访问栈顶元素!\n");
else
printf("栈顶元素为:%d\n",Top_Stack(S));
getchar();getchar();
system("cls");
break;
case 4:
if(All_Stack(S)==ERROR)
printf("栈空,无法输出栈中元素!\n");
else
printf("输出成功!\n");
getchar();getchar();
system("cls");
break;
case 5:
if(Clear_Stack(S)==ERROR)
printf("栈已经为空,不用再次清空!\n");
else
printf("栈元素清空成功!\n");
getchar();getchar();
system("cls");
break;
case 0:
printf("退出成功!\n");
exit(0);
default:printf("输入错误,请重新输入!\n");
getchar();getchar();
system("cls");
}
}
return 0;
}
有错误还请大家指正!