栈之链栈

来源:互联网 发布:最新影视软件 编辑:程序博客网 时间:2024/05/16 11:36

本文主要介绍链栈。链栈就是没有附加头结点的运算受限的单链表。在文中的栈顶指针放在一个结构体中,主要是为了操作方便,也可以不放在结构体里面,这个看个人啦~~数据结构真的很有意思,我会一直学习,将我知道的理解的数据结构呈现出来,当然错误之处难免,还请各位指出,共同进步哈奋斗

#include<cstdio>#include<cstdlib>typedef char Datatype;            //假定栈元素的数据类型为字符typedef struct node{    Datatype data;    struct node *next;}StackNode;typedef struct{       //LinkStack结构类型的定义是为了方便在函数体中修改top指针本身    StackNode *top;}LinkStack;//********************************栈的一些基本操作**********************************void InitStack(LinkStack *S){    //将顺序栈置空    S->top=NULL;}int StackEmpty(LinkStack *S){    //判断顺序栈是否为空,若为空,则返回真,否则返回假    return S->top==NULL;}void Push(LinkStack *S,Datatype x){    //进栈操作    StackNode *p=(StackNode *)malloc(sizeof(StackNode));    p->data=x;    p->next=S->top;         //将新结点*p插入链栈头部    S->top=p;               //修改栈顶指针}void Pop(LinkStack *S){    //出栈操作    StackNode *p=S->top;    //保存栈顶指针    if(StackEmpty(S)){        printf("Stack underflow\n");    //下溢,退出运行        return ;    }    S->top=p->next;         //将栈顶结点从链上摘下    free(p);}Datatype StackTop(LinkStack *S){    //取栈顶元素    if(StackEmpty(S)){                  //栈空则无法取栈顶元素        printf("Stack is empty!\n");        return '?';    }    return S->top->data;}void CreateStack(LinkStack *S){    //建立一个栈    char ch;    while((ch=getchar())!='\n'){        Push(S,ch);    }    return ;}//***********************************测试函数********************************int main(){    LinkStack S;    InitStack(&S);    printf("输入一个字符串,来建立一个字符顺序栈:\n");    CreateStack(&S);    printf("栈已建好!\n");    printf("栈顶元素是:%c\n",StackTop(&S));    printf("弹出栈顶元素:\n");    Pop(&S);    printf("此时栈顶元素为:%c\n",StackTop(&S));    printf("将元素‘z’进栈:\n");    Push(&S,'z');    printf("此时栈顶元素是:%c\n",StackTop(&S));    return 0;}
测试样例:



0 0