除了括号匹配有2种方法配图,其他请自行操作运行。
main.cpp

#include <iostream>
#include"head.h"
using namespace std;

int main()
{
    SeqStack s;
    InitStack(&s);
    ElemType Item;
    ElemType *v;
    SeqStack st;
    InitStack(&st);
    int select=1;
   while(select)
   {
        printf("------------------栈基本操作--------------------\n");
        printf("--[1]十进制转换为八进制----[2]判断栈是否已满----\n");
        printf("--[3]判断栈是否为空--------[4]入栈--------------\n");
        printf("--[5]显示栈中所有元素------[6]出栈--------------\n");
        printf("--[7]获得栈顶元素----------[8]返回栈中元素个数--\n");
        printf("--[9]清除栈中元素----------[10]销毁栈-----------\n");
        printf("--[11]括号匹配----------------------------------\n");
        printf("\n");
        printf("请选择>>>>>>>\n");
        scanf("%d",&select);
        if(select==0)
        {
            break;
        }
        switch(select)
        {

        case 2:
            if(IsFull(&s)==false)
            {
                printf("栈已满\n");
            }else{
            printf("栈未满\n");
            }
            break;
        case 3:
            if(IsEmpty(&s)==false)
            {
                printf("栈不为空\n");
            }
            else
            {
                printf("栈为空\n");
            }
            break;
        case 4:
            printf("请输入数据,以-1做结束标记\n");
            scanf("%d ",&Item);
            while(Item!=-1)
            {
            Push(&s,Item);//入栈(5分)
            scanf("%d",&Item);
            }
            break;
        case 5:
            Show(&s);//显示栈中所有元素(5分)
            break;
        case 6:
            Pop(&s);//出栈(5分)
            break;
        case 7:
            ElemType i;

            GetTop(&s,&i);//获得栈顶元素(5分)
            printf("栈顶元素为%d\n",i);

            break;
        case 8:
            printf("%d\n",Length(&s));//返回栈中元素个数(5分)
            break;
        case 9:
            Clear(&s);//清除栈中元素(5分)
            break;
        case 10:
            Destroy(&s);//销毁栈
            break;

        case 1:
            printf("输入一个十进制整数\n");
            int m;
            scanf("%d",&m);
            printf("转换为八进制为:\n");
            conver_8(m);//十进制转八进制
            break;
        case 11:
            char str[20];
            printf("输入括号:\n");
            gets(str);
            if(check_kh(str))
            printf("括号匹配。\n");
            else
            printf("括号不匹配。\n");
            break;
        default :
            printf("输入错误,请重新输入:\n");
            break;
        }
   }

    return 0;
}

head.h

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED


#include<stdio.h>
#include<malloc.h>
#include<assert.h>
typedef int ElemType;//定义栈中元素类型
typedef char DataType;
#define InitSize 10//定义顺序栈初始存储空间大小
#define IncSize 4//定义顺序栈增量存储空间大小
typedef struct SeqStack//定义栈结构
{
ElemType *base;//顺序栈存储空间基地址
int top;//栈顶位置,同时也表示栈中元素个数
int Stack_size;
}SeqStack;//栈当前空间大小,以元素为单位
///栈的基本操作
bool Inc(SeqStack *s);//当栈满是增加空间(5分)
void InitStack(SeqStack *s);//初始化栈(5分)
bool IsFull(SeqStack *s);//判断栈是否已满(5分)
bool IsEmpty(SeqStack *s);//判断栈是否为空(5分)
void Push(SeqStack *s,ElemType x);//入栈(5分)
void Show(SeqStack *s);//显示栈中所有元素(5分)
void Pop(SeqStack *s);//出栈(5分)
bool GetTop(SeqStack *s,ElemType *v);//获得栈顶元素(5分)
int Length(SeqStack *s);//返回栈中元素个数(5分)
void Clear(SeqStack *s);//清除栈中元素(5分)
void Destroy(SeqStack *s);//销毁栈
void conver_8(int n);//十进制转八进制
bool check_kh(char *s); //括号匹配

#endif // HEAD_H_INCLUDED

Seqlist.cpp

#include"head.h"


void InitStack(SeqStack *s)//初始化栈
{
    s->top=0;
    s->base=(ElemType *)malloc(sizeof(ElemType));
    s->Stack_size=InitSize;
}

bool Inc(SeqStack *s)//当栈满时增加空间
{
    if((s->top)==s->Stack_size)
    {
    ElemType *newbase=(ElemType *)realloc(s->base,sizeof(ElemType)*(s->Stack_size+IncSize));
    if(newbase==NULL)
    {
        printf("增加空间失败,内存空间已满!\n");
        return false;
    }else
    {
        s->base=newbase;
        s->Stack_size+=IncSize;
        return true;
    }
    }
}

bool IsEmpty(SeqStack *s)//判断栈是否为空
{
if(s->top==0)
{
    return true;
}
else
{
    return false;
}
}

void Push(SeqStack *s,ElemType x)//入栈(5分)
{
    if(s->top>=s->Stack_size)
    {
        s->Stack_size+=IncSize;
        s->base=(ElemType *)realloc(s->base,s->Stack_size * sizeof(ElemType));
    }else{
    s->base[s->top] = x;
    s->top++;
    }
}

void Show(SeqStack *s)//显示栈中所有元素
{
    for(int i=0;i<s->top;i++)
    {
        printf("%d ",s->base[i]);
    }
    printf("\n");
}

void Pop(SeqStack *s)//出栈
{
     if(s->Stack_size==0)
    {
        printf("栈已空\n");
        return;
    }
    else
    {
        s->top--;
    }
    return;
}

bool GetTop(SeqStack *s,ElemType *v)//获得栈顶元素
{

    if(s->top==0)
    {
      // printf("空栈,没有栈顶元素\n");
       return false;
    }

    *v=s->base[s->top-1];
    //printf("栈顶元素为%d\n",*v);
    return true;

}

int Length(SeqStack *s)//返回栈中元素个数
{
    return s->top;
}

void Clear(SeqStack *s)//清除栈中元素
{
    s->top=0;
}

void Destroy(SeqStack *s)//销毁栈
{
    free(s->base);
    s->base=NULL;
    s->Stack_size=0;
}

bool IsFull(SeqStack *s)//判断栈是否已满(5分)
{
    if(s->top==s->Stack_size)
    {
        return false;
    }
    return true;
}

void conver_8(int n)//十进制转八进制
{
    SeqStack st;
    InitStack(&st);
    ElemType Item;
    while(n)
    {
        Push(&st,n%8);
        n=n/8;
    }
    while(!IsEmpty(&st))
    {
        if(GetTop(&st,&Item))
            {
                printf("%d",Item);
            }
        Pop(&st);
    }
    printf("\n");
}
//括号匹配有不同的方法,结果也不一样
bool check_kh(char *s)  //括号匹配方法一
{
   SeqStack st;
   InitStack(&st);
   ElemType Item;
   gets(s);
   while(*s!='*')
   {
       if(*s=='(' || *s=='[')
       {
             Push(&st,*s);
       }
       else if(*s==')')
       {
           GetTop(&st,&Item);
           if(Item!='(')
                return false;
           else
               Pop(&st);
       }
       if(*s==']')
       {
           GetTop(&st,&Item);
           if(Item!='['  )
                return false;
           else
                 Pop(&st)  ;
       }
       s=s+1;
       gets(s);
   }
   if(IsEmpty(&st))
    return true;
   else
    return false;
}
/*
bool check_kh(char *s) //括号匹配方法二
{
   SeqStack st;
   InitStack(&st);
   ElemType Item;
   gets(s);
   while(*s!='\0')
   {
       if(*s=='(' || *s=='[')
       {
              Push(&st,*s);
       }
       if(*s==')')
       {
           GetTop(&st,&Item);
           if(Item!='(')
                return false;
           else
                  Pop(&st);
       }
       if(*s==']')
       {
           GetTop(&st,&Item);
           if(Item!='[')
                return false;
           else
               Pop(&st);
       }
       s=s+1;
   }
   if(IsEmpty(&st))
    return true;
   else
    return false;
}
*/


方法一:
我自己运行的是只能插入单副括号,一多就不行了。

方法二:
能多但不能太多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
综合来看,方法二挺好,可根据需要选择。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值