相比于最开始的顺序表——数组的一种拓展;而栈这种结构则是对数组更深意义上的改造,在栈这个结构中有新意义上的栈顶元素和栈底元素分别代表这个结构的初始位置以及末端位置,栈这种结构是一种”先入后出“的结构,是说想要使用结构中元素时只能从最末端的元素开始拿取。
这里贴一下关于栈的基本操作
typedef int Status;
//栈的定义(线性栈)
typedef struct {
char *top;//栈顶指针
char *base;//栈底指针
int stack_size;//总栈的元素个数
}stack;
//栈的初始化
Status init(stack *s){
s->base=(char *) malloc(sizeof(char)*MaxSize);//开辟内存空间
s->top=s->base;//栈顶指针指向栈底指针
s->stack_size=MaxSize;//栈空间总量
return OK;
}
//压栈(向栈中存储数据)
Status push(stack *s,char e){
if(s->top -s->base==MaxSize){
return ERROR;//判断是否满栈
}
*s->top = e;//给top指针的指向赋值
s->top++;//top指针向后移
}
//出栈(将最后一个元素踢出栈)
Status pop(stack *s){
if(s->top==s->base){
return ERROR;//若栈为空返回ERROR
}
s->top--;//栈向前移一位
return OK;
}
//获取栈顶元素
char get_top(stack *s){
if(s->top==s->base){
return ERROR;//判断栈是否为空
}
return *s->top;//返回栈顶元素
}
//判断栈是否为空(判断头尾是否指向同一元素)
Status isEmpty(stack *s){
if(s->top==s->base){
return OK;//如果栈为空返回OK
}
return ERROR;
}
//获取栈长
Status length(stack *s){
return (s->top-s->base);//返回栈顶指针减去栈首指针
}
//输出栈中元素(遍历整个栈)
Status print(stack *s){
for(int i=0;i< length(s);i++){
printf("%c ",*(s->top-i-1));
}
}
关于栈的应用有很多,像判断回文,判断匹配,计算算术表达式等等,这里写的是一个比较简单的判断表达式的括号是否匹配
//算法函数
//思路便是遍历表达式将其中的正括号入栈包括'(','[','{',当遍历到反括号时则去匹配栈顶元素,若不匹配便直接返回ERROR,若匹配则令栈顶元素出栈,继续遍历,往复循环直到遍历结束且栈为空。
Status check(stack *s,char *text){
for(int i=0;i< strlen(text);i++){
//判断正括号入栈
if(text[i]=='('||text[i]=='['||text[i]=='{'){
push(s,text[i]);
print(s);
printf("\n");
}
//遇到反括号检查栈顶元素是否匹配
if(text[i]==')'){
if(*(s->top-1)=='('){
pop(s);
} else{//若不匹配直接返回ERROR
return ERROR;
}
}
if(text[i]==']'){
if(*(s->top-1)=='['){
pop(s);
} else{
return ERROR;
}
}
if(text[i]=='}'){
if(*(s->top-1)=='{'){
pop(s);
} else{
return ERROR;
}
}
}
//最后判断是否全部匹配完
if(s->top-s->base>0)
return ERROR;
return OK;
}