C/C++语言之顺序栈

栈(Stack)定义

限定在一端进行插入和删除的线性表

特性

(Last In First Out, LIFO)后进先出表

图示及术语

栈:

栈顶top:插入/删除

栈底bottom:另一端

栈顶移动,栈底固定

入栈(压栈)push

出栈(弹栈)pop

顺序栈(Array-based  Stack )

—— 用顺序存储结构实现的栈

用一组内存地址连续的存储单元,

自栈底到栈顶依次存放数据元素

栈底:固定的,习惯上放在数组下标小的那端

栈顶:变化的,设整型变量 top  指示栈顶位置

入栈:top ++ ;出栈:top --

源代码:

#pragma warning( disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ElemType char 
#define _CRT_SECURE_NO_WARNINGS
//定义一个数据结构
typedef struct
{
    ElemType *data;//存储数据
    int top;
    int size;
}Sepstack, *pSepstack;
void Creat_stack_init(pSepstack s, int len)//初始化栈
{
    s->data = (ElemType *)malloc(len * sizeof(ElemType));
    if (s->data == NULL)
    {
        printf("内存分配失败");
    }
    else
    {
        s->size = len;
        s->top = -1;
    }
}
void push_stack(pSepstack s, ElemType datas)//压入栈
{
    if (s->top == s->size - 1)
    {
        printf("栈满了");

    }
    else
    {
        s->top++;
        s->data[s->top] = datas;
    }
}

void pop_stack(pSepstack s, ElemType *datas,int n)//弹出栈
{
    datas = (ElemType *)malloc(n*sizeof(ElemType));

    if (s->top ==-1)
    {
        printf("栈空");

    }
    else
    {
        for (int i = 0; i < 6;)
        {
            datas[i] = s->data[s->top];
             s->top--;
             i++;
        }                
    }
    printf("观察栈弹出数据:\n");
    for (int  j= 0; j < 6;)
    {
        printf("%c\n", datas[j]);
        j++;
    }
}
void Seq_Print(pSepstack s)//输出栈数据
{
    printf("输出栈数据:\n");
    for (int i = 0; i <= s->size-1;)
    {
        printf("%c\n", s->data[i]); 
        i++;
    }
    printf("\n");
}
Sepstack s1 ;
//判断栈是否为空
void seq_isempty(pSepstack s)
{
    if (s->top ==- 1)
    {
        printf("栈为空\n");
    }
    else
    {

        printf("栈不为空\n");
    }
}
//搜索栈中元素
void seq_search(pSepstack s, ElemType datas)
{
    while (s->data[s->top] != datas)
    {        
        s->top--;
    }
    printf("搜索栈中元素:%c:\n", s->data[s->top]);

}
//清空栈
void seq_clearn(pSepstack s)
{
    s->top = -1;
}

int main()
{
    
    ElemType  *p=NULL;
    char s2 = 0;
    Creat_stack_init(&s1, 6);
    push_stack(&s1, '1');
    push_stack(&s1, '2');
    
    push_stack(&s1, '3');
    push_stack(&s1, '4');
    push_stack(&s1, '5');
    push_stack(&s1, '6');
    seq_isempty(&s1);//判断栈是否为空
    pop_stack(&s1,p,6);

    printf("\n");
    Seq_Print(&s1);
    //搜索栈中为4的原属
    seq_search(&s1,'4');
    //判断是否清空栈
    seq_clearn(&s1);
    seq_isempty(&s1);
    system("pause");
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_39016425/article/details/83990513