链栈的基本接口实现

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE   1
#define FALSE  0
#define OK     1
#define ERROR  0
#define IBFEASIBLE  -1
#define OVERFLOW    -2 

typedef int Status;
typedef int ElemType; /* 元素类型为int类型*/

//链栈类型
typedef struct LSNode{
    ElemType data;        //数据域
    struct LSNode *next;    //指针域
}LSNode, *LStack;         //结点和链栈类型 

Status InitStack_LS(LStack &S);
void DestroyStack_LS(LStack &S);
Status StackEmpty_LS(LStack S);
Status Push_LS(LStack &S,ElemType e);
Status Pop_LS(LStack &S,ElemType &e);
Status GetTop_LS(LStack S, ElemType &e);
Status Traverse(LStack S);
int LengthLStack(LStack S); 

//链栈的基本操作实现代码如下:

//1.初始化链栈
Status InitStack_LS(LStack &S){
    S=(LSNode*)malloc(sizeof(LSNode));
    if(S==NULL)return OVERFLOW;
    S->next = NULL;
    return OK;
}

//2.销毁链栈
void DestroyStack_LS(LStack &S){
    LStack p=S->next,q=S;
      while(p){
        free(q);
          q=p;
          p=p->next;
    }
  free(p);
}

//3.判空操作
Status StackEmpty_LS(LStack S){
    if(S->next==NULL){
        return TRUE;
    }else{
        return FALSE;
    }
} 

//4.入栈
Status Push_LS(LStack &S,ElemType e){
    LSNode *t;
      t=(LSNode*)malloc(sizeof(LSNode));//为元素e分配空间
      if(t==NULL) return FALSE;
      t->data=e;
      t->next=S;
      S=t;
      return OK;
} 

//5.出栈
Status Pop_LS(LStack &S,ElemType &e){
    LSNode *t;
      if(S==NULL) return ERROR;
      t=S;        //t指向栈顶元素的节点
      e=S->data;
      S=S->next;        //删除栈顶结点
      free(t);        //释放节点t
      return OK;
} 

//6.取出栈顶元素
Status GetTop_LS(LStack S,ElemType &e){
    if(S==NULL) return ERROR;
      e=S->data;
      return OK;
} 

//7.链栈的长度
int LengthLStack(LStack S){
    int length;
    while(S->next){
        S=S->next;
        length++;
    }
    return length;
} 

//8.遍历栈
Status Traverse(LStack S)
{
    LSNode *p;
    p = S;
    while (p->next){
        printf("%4d", p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

int main(){
    int i,e,j,m;
    LStack S;
    do{
        printf("1.初始化链栈\n");
        printf("2.销毁链栈\n");
        printf("3.判断链栈是否为空\n");
        printf("4.将元素压入栈\n");
        printf("5.栈顶元素出栈\n");
        printf("6.取栈顶元素,并返回\n");
        printf("7.链栈的长度\n");
        printf("8.遍历链栈元素\n");
        printf("请输入你要进行的操作:\n");
        scanf("%d",&i);
        switch(i){
            case 1 :
                    if(InitStack_LS(S)){
                        printf("初始化成功\n");
                        printf("请输入5个元素进栈:\n");
                        for(j=0;j<5;j++){
                            scanf("%d",&e);
                            Push_LS(S,e);
                        }
                    }else{
                        printf("初始化失败\n");
                    }
                    break;
            case 2 :
                    DestroyStack_LS(S);
                    printf("销毁栈成功\n");
                    break;
            case 3 :
                    if(StackEmpty_LS(S)){
                        printf("链栈为空!\n");
                    }else{
                        printf("链栈不为空!\n");
                    }
                    break;
            case 4 :
                    printf("请输入压入栈元素的值:\n");
                    scanf("%d",&e);
                    if(Push_LS(S,e)){
                        printf("成功压入\n");
                    }else{
                        printf("压入失败\n");
                    }
                    break;
            case 5 :
                    Pop_LS(S, m);
                    printf("成功出栈,数值为:%d\n",m);
                    break;
            case 6 :
                    GetTop_LS(S,m);
                    printf("取出栈顶元素的值:%d\n",m);
                    break;
            case 7 :
                    printf("链栈的长度为:%d\n",LengthLStack(S));
                    break;
            case 8 :
                    printf("链表中元素:");
                    Traverse(S);
                    break;
        }
    }while(i>0&&i<=8);
    return 0;
}
 
时间: 2024-10-13 10:43:01

链栈的基本接口实现的相关文章

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

栈的Java实现--链栈

栈的Java实现--链栈 链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易. 链栈的基本结构: 链栈的入栈操作: 让top引用指向新的节点,新节点的next指向原来的top 记录栈内元素个数的size+1 链栈的出栈操作: top引用指向原栈顶元素的下一个元素(top.next),并释放原栈顶元素的引用 记录栈内元素个数的size-1 链栈的Java实现代码: package com.liuhao.DataStr

链栈的实现问题

问题描述:用链式存储实现栈的基本操作 涉及变量:top:自定义Node类,指向栈顶元素的结点 涉及教材:<数据结构--Java语言描述(第2版)> 清华大学出版社 大致思路: 链式存储结构一般是通过链接结点类来形成链 出栈是由栈顶元素向栈底元素方法依次输出 则top的位置需指向栈顶元素 判空的根据是top结点是否为空,即栈顶元素是否存在 置空只需要将top指针指向null,则可以重新开始入栈操作 求长度需要遍历了全部结点后才能计算准确长度 陈列元素也需要遍历各元素,与求长度的算法有点类似,只是

链栈的实现

链栈即链式栈,也就是说我们不用再考虑空间的大小,可随心所欲的进行数据的插入/删除了.和顺序栈一样,仍然要保持其stack的特性,只在一端进行插入和删除,后进先出. 示例代码: #ifndef _LINKSTACK_H #define _LINKSTACK_H typedef int ElemType; typedef int Status; typedef struct linkStack { ElemType data; struct linkStack * top; }linkStack;

堆栈(链栈)

#include<cstdlib> #include<iostream> #include<fstream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char SElemType; typedef struct StackNode{ SElemType data; struct StackNode *next; }S

链栈和链队列的类实现

#include<iostream>#include<cassert> using namespace std; template <class T>//链栈 struct LinkNode{T data;LinkNode<T> *Link;LinkNode(LinkNode<T> *pr=NULL){Link=pr;}LinkNode(const T& item,LinkNode<T> *pr=NULL){data=item

链栈-书上习题

元素的入栈出栈 链栈: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 struct stack 5 { 6 char data; 7 stack *next; 8 }; 9 stack* initstack() /*为栈头指针申请内存*/ 10 { 11 stack *s=new stack; 12 s->next=NULL; 13 return s; 14 } 15 int isempt

java实现链栈

前面学习了java实现顺序栈:http://www.cnblogs.com/lixiaolun/p/4644134.html 接下来,学习java实现链栈. 链栈类代码: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */

数据结构(C实现)------- 链栈

描述:      链栈,即栈的链式存储结构,链栈通常使用不带头结点的单链表来表示,因此其结点的结构和单链表的结点结构相同. 在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点.因此,新入栈的元素即为链表中采用头插法新加入的结点,一个链栈可以由栈顶指针唯一确定,当top为NULL时,则表示该栈是一个空的链栈.  实现:   链栈结点的类型描述: typedef int ElemType; typedef struct node{ ElemType data; struct nod