栈是一种特殊的线性表,它只能够先入后出,它可以用数组实现,即顺序存储方式,也可以用链式的存储结构。
下面,我用C语言实现栈(链式存储结构)的压入和弹出等操作,并把每个函数用打印输出的形式进行验证。
/*******************************************************************/
//描述:栈的链式存储结构的创建,插入,删除等基本操作的函数,以及对这些操作进行验证
//时间:2018.1.1 10:00.这是我进入2018年的第一个程序
//作者:Liu ZhenHua
//*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char SElemType;
typedef struct StackNode{ //定义一个节点
SElemType data;
struct StackNode *next;
}StackNode,*StackNodePtr;
typedef struct{
StackNodePtr Top; //栈的头指针,即栈顶
int count; //栈内的元素数目
}LinkStack,*LinkStackPtr;
Status GetTop(LinkStackPtr LS,SElemType *e); //取出栈顶元素
Status LinkStackPush(LinkStackPtr LS,SElemType e); //压栈
Status LinkStackPop(LinkStackPtr LS,SElemType *e); //出栈
void InitLinkStack(LinkStackPtr SL); //初始化链表
void PrintLinkStack(LinkStackPtr SL); //顺序栈内元素
int GetCount(LinkStackPtr SL); //返回栈内元素数目
void printSL(void); //打印一行分割线
int main()
{
LinkStackPtr S;SElemType val,*pval;pval = &val;
S = (LinkStackPtr)malloc(sizeof(LinkStack));
S->Top = (StackNodePtr)malloc(sizeof(StackNode));
S->Top->next = NULL;
S->Top->data = 'a';
S->count = 1;
PrintLinkStack(S);
printSL();
if(LinkStackPush(S,'b'))printf("压栈成功!\n"); //压栈操作
PrintLinkStack(S);
printSL();
if(GetTop(S,pval))printf("取出栈顶元素为:%c\n",*pval); //取出栈顶元素
printSL();
if(LinkStackPop(S,pval))printf("出栈成功!出栈元素为: %c\n",*pval); //出栈
PrintLinkStack(S);
printSL();
ClearLinkStack(S); //清空栈
printf("清空整个栈!\n");
PrintLinkStack(S);
return 0;
}
/**********************************************/
//函数名:GeeTop
//描述 :取出栈顶元素
//参数 :链栈结构体指针,元素值指针
//返回值:状态值
/**********************************************/
Status GetTop(LinkStackPtr LS,SElemType *e){
if(LS->count==0){
return ERROR; //空栈
}
*e = LS->Top->data;
return OK;
}
/**********************************************/
//函数名:LinkStackPush(
//描述 : 压栈
//参数 :链栈结构体指针,元素值
//返回值:状态值
/**********************************************/
Status LinkStackPush(LinkStackPtr LS,SElemType e){
StackNodePtr newNode;
newNode = (StackNodePtr)malloc(sizeof(StackNode));
newNode->data = e;
newNode->next = LS->Top;
LS->Top = newNode;
LS->count++;
return OK;
}
/**********************************************/
//函数名:LinkStackPop
//描述 : 出栈栈
//参数 :链栈结构体指针,元素值指针
//返回值:状态值
/**********************************************/
Status LinkStackPop(LinkStackPtr LS,SElemType *e){
StackNodePtr p;
if(LS->count==0){
return ERROR; //空表
}
*e = LS->Top->data;
LS->count--; //元素数目自减
p = LS->Top;
LS->Top = LS->Top->next;
free(p);
return OK;
}
/**********************************************/
//函数名: InitLinkStack
//描述 : 栈的初始化,头针指向空,表的数据元素为0
//参数 :链栈结构体指针
//返回值:状态值
/**********************************************/
void InitLinkStack(LinkStackPtr SL){
SL->count = 0;
SL->Top->next=NULL;
}
/**********************************************/
//函数名: ClearLinkStack
//描述 : 清空整个链表
//参数 :链栈结构体指针
//返回值:状态值
void ClearLinkStack(LinkStackPtr SL){
int i,k;
k = SL->count;
StackNodePtr p;
for(i = 0; i < k; i++){
p = SL->Top;
SL->Top = SL->Top->next;
free(p);
}
SL->count = 0;
}
/**********************************************/
//函数名: PrintLinkStack
//描述 : 打印栈内元素
//参数 :链栈结构体指针
//返回值:无
/**********************************************/
void PrintLinkStack(LinkStackPtr SL){
int k,i;SElemType val;
k = SL->count;
StackNodePtr p;
p = SL->Top;
for(i = 0; i < k; i++){
val = p->data;
p = p->next;
printf("第%d个元素: %c\n",i+1,val);
}
printf("打印结束,共有%d个元素。\n",i);
}
/**********************************************/
//函数名: GetCount
//描述 : 返回栈内元素个数
//参数 :链栈结构体指针
//返回值:int型栈内元素数
/**********************************************/
int GetCount(LinkStackPtr SL){
return SL->count;
}
/**********************************************/
//函数名: printSL
//描述 : 打印一行分割线Print Split Line
//参数 :结无
//返回值:无
//作者 :LiuZhenHua
/**********************************************/
void printSL(void){
int i;
for(i = 0; i < 20; i++){
printf("-");
}
printf("\n");
}