版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}