【数据结构】顺序栈的实现(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/82755716

栈的基本概念及其描述

栈是一种特殊的线性表,规定它的插入运算和删除运算均在线性表的同一端进行,进行插入操作和删除操作的那一端称为栈顶,另一端称为栈底。

栈的插入操作和删除操作分别称为进栈和出栈。

FILO(First In Last Out)后进先出/先进后出

eg.有1.2.3号火车一次进站,它们的出栈顺序可以是

1.2.3(1来,1走,2来,2走,3来,3走

2.1.3(1来,2来,2走1走,3来,3走

1.3.2(1来,1走,2来,3来,3走2走

3.2.1(1来,2来,3来,3走2走1走

2.3.1(1来,2来,2走,3来,3走1走

栈的主要操作是插入操作和删除操作。

栈(顺序存储)主要要掌握以下操作:

1、初始化

2、判断栈是否为空

3、读栈顶节点值

4、栈的插入操作

5、栈的删除操作

运行环境:Code::Blocks 17.12

下面是头文件 

#ifndef SEQSTACK_H_INCLUDED
#define SEQSTACK_H_INCLUDED
#define MAXSIZE 100
#include "stdio.h"
#include "stdlib.h"
typedef int datatype;
typedef struct
{
    datatype a[MAXSIZE];
    int top;
}sequence_stack;

//栈(顺序存储)的初始化
void init (sequence_stack *st)
{
    st->top=0;
}

int isempty(sequence_stack st)
{
    return (st.top?0:1);
    //如果是空的话则返回1
}

//取得栈顶(顺序储存)节点值
int read(sequence_stack st)
{
    if (isempty(st))
    {
        printf("该栈是空的!!\n");exit(1);
    }
    else
    {
       return st.a[st.top-1];
    }
}

//栈(顺序储存)插入操作
void push(sequence_stack *st,datatype x)
{
    if(st->top==MAXSIZE)
    {
        printf("该栈是满的!\n");exit(1);
    }
    st->a[st->top]=x;
    st->top++;
}

//栈(顺序储存)的删除操作
void pop(sequence_stack *st)
{
    if (st->top==0)
    {
        printf("该栈是空的!\n");
        exit(1);
    }
    st->top--;
}

//判断表达式的括号是否匹配
int match_kuohao(char c[])
{
    int i=0;
    sequence_stack s;
    init(&s);
    while(c[i]!='#')
    {
        switch(c[i])
        {
            case '{':
            case '[':
            case '(':push(&s,c[i]);break;
            case '}':
            {
                if (!isempty(s) && read(s)=='{')
                {
                    pop(&s);break;
                }
                else
                {
                    return 0;
                }
            }
            case ']':
            {
                if (!isempty(s) && read(s)=='[')
                {
                    pop(&s);break;
                }
                else
                {
                    return 0;
                }
            }
            case ')':
            {
                if (!isempty(s) && read(s)=='(')
                {
                    pop(&s);break;
                }
                else
                {
                    return 0;
                }
            }
        }
        i++;
    }
    return (isempty(s));/*栈是空的则匹配,否则不匹配*/
}

void convert(sequence_stack st,int x,int y)
{
    init(&st);
    while(x>0)
    {
        push(&st,x%y);
        x/=y;
    }
    while(st.top)
    {
        printf("%d",read(st));
        pop(&st);
    }
    printf("\n");
}

void menu()
{
    printf("\t|===================================|\t\n");
    printf("\t|                                   |\t\n");
    printf("\t|          顺序栈及其实现           |\t\n");
    printf("\t|                                   |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|有如下选项:                        |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|【1】栈的初始化                    |\t\n");
    printf("\t|【2】判断栈是否为空                |\t\n");
    printf("\t|【3】取得栈顶的节点值              |\t\n");
    printf("\t|【4】栈的插入操作                  |\t\n");
    printf("\t|【5】栈的删除操作                  |\t\n");
    printf("\t|【6】进制转换                      |\t\n");
    printf("\t|【7】判断表达式括号是否匹配        |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|Ctrl+C结束该程序!!!             |\t\n");
    printf("\t|===================================|\t\n");
}

#endif // SEQSTACK_H_INCLUDED

下面是主程序

#include "stdio.h"
#include "seqstack.h"
int main ()
{
    sequence_stack st;
    int i,k;
    datatype a;
    char str[100];
    while(1)
    {
        menu();
        printf("\n\n请输入你的选择:");
        scanf("%d",&i);
        switch (i)
        {
            case 1:
            {
                init(&st);
                break;
            }
            case 2:
            {
                if(isempty(st))
                    printf("该顺序栈为空。");
                else
                    printf("该顺序表不是空栈。");
                printf("已进行判断。\n\n");break;
            }
            case 3:
            {
                printf("%d",read(st));
                printf("\n成功打印顺序栈顶的节点值。\n\n");
                break;
            }
            case 4:
            {
                printf("请输入一个想要插入的数:");
                scanf("%d",&a);
                push(&st,a);
                break;
            }
            case 5:
            {
                pop(&st);
                printf("栈顶节点已成功删除!\n");
                printf("还剩下%d个节点\n",st.top);
                break;
            }
            case 6:
            {
                printf("请输入一个数字,以及想要转化为的进制:");
                scanf("%d%d",&a,&k);
                convert(st,a,k);
                break;
            }
            case 7:
            {
                printf("以“#”结束\n\n");
                scanf("%s",str);
                if(match_kuohao(str))
                {
                    printf("配对!\n\n");
                }
                else
                {
                    printf("不配对!\n\n");
                }
                break;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/82755716