目录
建立栈
首先我们应该认识到栈的特点:后进的元素先出
然后我们建立一个栈,并实现输入输出
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
其中,stacksize指示栈的当前可使用的最大容量。栈的初始化操作为:按设定的初始分配量进行第一次存储分配,base可称为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。称top为栈顶指针,其初值指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。下图展示了顺序栈中数据元素和栈顶指针之间的对应关系。
栈结构的应用,例题
从键盘输入一个仅包括(、) 、[、]、{、}共6 种字符的括号串,使用栈检查其合法性。如:[ ] { }、[ { ( ) } ] 合法;[ ] ( { }、 { [ } ] 非法。
分析:每当我们从左到右扫描,每次扫描到一个左括号,我们就把他们存起来。当扫描到右括号,我们匹配,匹配成功,则对应的左括号应当释放掉,然后继续下一次扫描,
这里左括号的存储和释放满足栈的特点,我们使用栈的数据结构
见代码:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#define MAX_size 10
typedef struct {
char* base;
char* top;
int size;
}Stack;
//初始化栈
void InitStack(Stack* s)
{
s->base = (char*)malloc(MAX_size * sizeof(char));
s->top = s->base;
s->size = MAX_size;
}
//判断栈空
int IsEmpty(Stack s)
{
if (s.top == s.base)
{
return 1;
}
return 0;
}
//入栈
void Push(Stack* s,char x)
{
//判断栈满
if (s->top - s->base >= s->size)
{
//栈满,返回
return;
}
*s->top = x;
s->top++;
}
//出栈
char Pop(Stack* s)
{
char x;
if (s->top == s->base)
{
//栈空
exit(0);
}
s->top--;
x = *s->top;
return x;
}
//匹配
int matching(Stack* s,char ch[],int length)
{
Stack* p = s;
for (int i = 0; i < length; i++)
{
if (ch[i] == '(' || ch[i] == '[' || ch[i] == '{')
{
Push(p, ch[i]);
}
else
{//扫描到右括号,如果表空,则说明为右括号单身情况
if (IsEmpty(*p))
{
return 0;
}
//x接受栈顶元素
char x;
x = Pop(p);
if (ch[i] == ')' && x != '(')
{
return 0;
}
if (ch[i] == ']' && x != '[')
{
return 0;
}
if (ch[i] == '}' && x != '{')
{
return 0;
}
}
}
return(IsEmpty(*p));
}
int main()
{
Stack s;
char ch[MAX_size] = {0};
InitStack(&s);
printf("输入要判断的字符串:");
scanf("%s", ch);
int length = 0;
length = strlen(ch);
if (matching(&s, ch, length)==0)
{
printf("匹配失败\n");
return 0;
}
printf("匹配成功\n");
}