除了括号匹配有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;
}
*/
方法一:
我自己运行的是只能插入单副括号,一多就不行了。
方法二:
能多但不能太多。
综合来看,方法二挺好,可根据需要选择。