04 栈的实现和应用

实验目的:

  1. 熟悉栈的定义和基本操作
  2. 掌握栈的顺序存储结构设计与基本操作的实现

实验任务与要求:

⑴ 定义栈的顺序存储表示

⑵ 基于所设计的存储结构实现栈的基本操作

⑶ 编写一个主程序对所实现的栈进行测试

⑷ 栈的应用:编程实现括号匹配的检验

实验内容

1、采用书上第 46 页定义的栈的顺序存储表示,编程实现栈的下列基本操作。

(1)初始化顺序栈 (2)创建顺序栈 (3)判断栈空 (4)输出顺序栈

(5)取栈顶元素 (6)入栈 (7)出栈

2、采用栈的顺序存储表示,编程实现表达式中圆括号“( )”和方括号“[ ]”匹配的检验。

程序清单:

第一题:

#define _CRT_SECURE_NO_WARNINGS

#include<stdlib.h>

#include <stdio.h>

#define TRUE 1

#define FALSE 1

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define STACK_INIT_SIZE 100

#define STACKINCERMENT 10

typedef int Status;

typedef int SElemType;

typedef struct

{

    SElemType* base;

    SElemType* top;

    int stacksize;

}SqStack;

Status InitStack(SqStack& S) {

    //构造一个空栈S

    S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));

    if (!S.base) exit(OVERFLOW);

    S.top = S.base;

    S.stacksize = STACK_INIT_SIZE;

    return OK;

}//InitStack

Status StackEmpty(SqStack& S) {

    if (S.base == S.top)

         return TRUE;

    else

        return FALSE;

}//StackEmpty

Status GetTop(SqStack& S, SElemType& e) {

    //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR;

    if (S.top == S.base)return ERROR;

    e = *(S.top - 1);

    return OK;

}//GetTop

Status Push(SqStack& S, SElemType e) {

    //插入元素e为新的栈顶元素

    if (S.top - S.base >= S.stacksize) {

         //栈满,增加存储空间

         S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCERMENT) * sizeof(SElemType));

         if (!S.base) exit(OVERFLOW);//存储分配失败

         S.top = S.base + S.stacksize;

         S.stacksize += STACKINCERMENT;

    }

    *S.top++ = e;

    return OK;

}//push

Status Pop(SqStack& S, SElemType& e) {

    //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR;

    if (S.top == S.base)return ERROR;

    e = *--S.top;

    return OK;

}//Pop

Status Stackoutput(SqStack& S) {

    //若栈不空,则从栈顶到栈底输出数据元素,返回OK;否则返回ERROR;

    SElemType* p;

    if (S.top == S.base)return ERROR;

    p = S.top;

    while (p!= S.base)

    {

         printf("%d ", *(p-1));

         p--;

    }

    return OK;

}//Stackoutput

Status StackTraverse(SqStack& S) {

    //若栈不空,则从栈底到栈顶输出数据元素,返回OK;否则返回ERROR;

    SElemType* p;

    if (S.top == S.base)return ERROR;

    p = S.base;

    while (p!= S.top)

    {

         printf("%d ", *p);

         p++;

    }

    return OK;

}//StackTraverse

void main() {

    int i, n, h, k, a, b;

    SqStack S;

    printf("创建一个空栈!\n");

    InitStack(S);

    printf("判断栈是否为空!\n");

    printf("StackEmpty(S)=%d\n", StackEmpty(S));

    printf("创建栈的元素个数:\n");

    scanf("%d", &n);

    printf("输出%d个入栈元素的值:\n", n);

    for (i = 0; i < n; i++) {

         scanf("%d", &k);

         Push(S, k);

    }

    printf("逆序输出顺序栈元素值:\n");

    Stackoutput(S);

    printf("\n");

    printf("输出顺序栈元素值:\n");

    StackTraverse(S);

    printf("\n");

    printf("输入入栈元素值:\n");

    scanf("%d", &h);

    Push(S, h);

    printf("输出入栈后的顺序栈元素:\n");

    StackTraverse(S);

    Pop(S, a);

    printf("\n");

    printf("输出第一个栈元素值:%d\n", a);

    Pop(S, a);

    printf("输出第二个栈元素值:%d\n", a);

    printf("输出两次出栈后顺序栈元素值:\n");

    StackTraverse(S);

    GetTop(S, b);

    printf("\n");

    printf("输出栈顶元素值:%d\n", b);

}

第二题:

#include<iostream>

using namespace std;

#include<string>

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define STACK_ININ_SIZE 100

typedef char SElemType;

typedef int Status;

typedef struct

{

    SElemType* top;

    SElemType* base;

    int stacksize;

}sqstack;

Status InitStack(sqstack& s)

{

    s.base = new SElemType;

    if (!s.base)

         exit(OVERFLOW);

    s.top = s.base;

    s.stacksize = STACK_ININ_SIZE;

    return OK;

}

Status IsEmpty(sqstack& s)

{

    if (s.top == s.base)

         return ERROR;

    else

         return OK;

}

Status Push(sqstack& s, SElemType e)

{

    *s.top = e;

    s.top++;

    return OK;

}

Status Pop(sqstack& s, SElemType& e)

{

    if (s.top == s.base)

         return ERROR;

    s.top--;

    e = *s.top;

    return OK;

}

Status Correct(SElemType str[])

{

    sqstack s;

    InitStack(s);

    int i;

    int state = 1;

    SElemType e;

    for (i = 0; str[i] != '\0'; i++)

    {

         switch (str[i])

         {

         case '(':Push(s, str[i]); break;

         case '[':Push(s, str[i]); break;

         case ')':

             if (Pop(s, e) == OK)

             {

                  if (e != '(')

                      state = 0;

             }

             else

             {

                  state = 0;

             }

             break;

         case ']':

             if (Pop(s, e))

             {

                  if (e != '[')

                      state = 0;

             }

             else

             {

                  state = 0;

             }

             break;

         }

         if (!state)

         {

             break;

         }

    }

    if (!IsEmpty(s) && state == 1)

         return OK;

    else

         return ERROR;

}

int main()

{

    SElemType str[100];

    cout << "请输入带括号的表达式:" << endl;

    cin >> str;

    if (Correct(str) == OK)

         cout << "括号匹配正确!" << endl;

    else

         cout << "括号匹配不正确!" << endl;

    return 0;

}

运行情况:

第一题:

第二题:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值