zoukankan      html  css  js  c++  java
  • 数据结构 线性顺序栈

    //线性顺序栈
    #ifndef _MY_SEQSTACK_H_
    #define _MY_SEQSTACK_H_
    
    typedef void SeqStack;
    
    //创建栈
    SeqStack* SeqStack_Create(int capacity);
    
    //销毁栈
    int SeqStack_Destroy(SeqStack* stack);
    
    //清空栈
    int SeqStack_Clear(SeqStack* stack);
    
    //压栈
    int SeqStack_Push(SeqStack* stack, void* item);
    
    //出栈
    void* SeqStack_Pop(SeqStack* stack);
    
    //获取栈顶元素
    void* SeqStack_Top(SeqStack* stack);
    
    //获取栈长度
    int SeqStack_Size(SeqStack* stack);
    
    //获取栈的原始容量
    int SeqStack_Capacity(SeqStack* stack);
    
    #endif //_MY_SEQSTACK_H_
    //线性顺序栈代码实现
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"SeqList.h"//引用线性顺序表dll
    #include"seqstack.h"
    
    /*
    顺序线性表模拟栈 
    入栈应该从尾部插入元素,从开头插入元素,需要向后移动所有元素
    */
    
    //创建栈
    SeqStack* SeqStack_Create(int capacity){
        return (SeqStack*)SeqList_Create(capacity);
    }
    
    //销毁栈
    int SeqStack_Destroy(SeqStack* stack){
        int ERRO_MSG = 0;
        if (stack==NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        ERRO_MSG=SeqList_Destroy(&stack);
        return ERRO_MSG;
    }
    
    //清空栈
    int SeqStack_Clear(SeqStack* stack){
        int ERRO_MSG = 0;
        if (stack == NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        ERRO_MSG=SeqList_Clear(stack);
        return ERRO_MSG;
    }
    
    //压栈
    int SeqStack_Push(SeqStack* stack, void* item){
        int ERRO_MSG = 0;
        if (stack == NULL || item==NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        ERRO_MSG = SeqList_Insert(stack, item, SeqList_Length(stack));
        return ERRO_MSG;
    }
    
    //出栈
    void* SeqStack_Pop(SeqStack* stack){
        int ERRO_MSG = 0;
        if (stack == NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return NULL;
        }
        return SeqList_Delete(stack, SeqList_Length(stack)-1);
    }
    
    //获取栈顶元素
    void* SeqStack_Top(SeqStack* stack){
        int ERRO_MSG = 0;
        if (stack == NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return NULL;
        }
        return SeqList_Get(stack, SeqList_Length(stack)-1);
    }
    
    //获取栈长度
    int SeqStack_Size(SeqStack* stack){
        int ERRO_MSG = 0;
        if (stack == NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        return SeqList_Length(stack);
    }
    
    //获取栈的原始容量
    int SeqStack_Capacity(SeqStack* stack){
        int ERRO_MSG = 0;
        if (stack == NULL)
        {
            ERRO_MSG = -1;
            printf("传入参数不可以为空!erro msg:%d 
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        return SeqList_Capacity(stack);
    }
    //线性顺序栈测试程序
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"seqstack.h"
    
    typedef struct _Student{
        char name[30];
        int age;
    }Student;
    
    void Test(){
        Student s1, s2, s3, s4, s5;
        int numx = 0, i = 0, ret = 0;
        strcpy(s1.name, "小米");
        s1.age = 11;
        strcpy(s2.name, "小刚");
        s2.age = 12;
        strcpy(s3.name, "小红");
        s3.age = 10;
        strcpy(s4.name, "啸天");
        s4.age = 13;
        strcpy(s5.name, "莲华");
        s5.age = 12;
        SeqStack *stack = NULL;
        //创建栈
        stack = SeqStack_Create(10);
        //压栈
        ret = SeqStack_Push(stack, &s1);
        if (ret!=0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = SeqStack_Push(stack, &s2);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = SeqStack_Push(stack, &s3);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = SeqStack_Push(stack, &s4);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = SeqStack_Push(stack, &s5);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        numx = SeqStack_Size(stack);
        //出栈
        for (i = 0; i < numx; i++)
        {
            Student *temp = (Student *)SeqStack_Pop(stack);
            printf("我的名字是%s;我的年龄是%d
    ", temp->name, temp->age);
        }
        //销毁链表
        ret=SeqStack_Capacity(stack);
        if (ret!=0)
        {
            printf("销毁链表失败!
    ");
            return;
        }
    }
    
    void main(){
        Test();
        system("pause");
    }

  • 相关阅读:
    .NET基础回顾(二)
    python 三元表达式、列表推导式、生成器表达式
    python 函数相关定义
    python 匿名函数
    python递归函数
    内置函数
    迭代器、生成器、面向过程编程
    python 函数对象、函数嵌套、名称空间与作用域、装饰器
    python django ORM 性能优化 select_related & prefetch_related
    python 函数
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5693301.html
Copyright © 2011-2022 走看看