这周我主要对栈方面的内容进行了学习,栈其实是一个只能在末端删除和插入的表,它的特点就是后进先出(或者叫先进后出)。栈可以用链表来实现,也可以用数组来实现,数组实现栈会比链表实现更简单一些,并且运算的速度也会快很多,唯一的弊端就是它需要提前声明一个数组的大小,但大多数时候这不会造成太大的影响,所以我主要对数组实现栈进行了学习。
在进行栈操作前,我们先要建立一个结构体,包括一个数组和一个头位置的数,即
typedef struct stack{
int *array; //或是其他数据类型
int num;
}*Stack;
然后我们要创建一个栈,就是这样:
Stack create(int max){
Stack s = (Stack)malloc(sizeof(struct stack));
s->array = (char*)malloc(sizeof(char)*max);
s->num = -1;
return s;
}
将一个数据进栈:
void push(char x, Stack s){
s->num++;
s->array[s->num] = x;
}
返回栈顶:
char top(Stack s){
return s->array[s->num];
}
数据出栈:
void pop(Stack s){
s->num--;
}
判断栈是否为空:
bool isempty(Stack s){
return s->num == -1;
}
ps:这只是对数组实现栈进行了简单的操作,并没有对栈满等情况进行讨论。
然后我还解决了一个字符平衡的问题,就是输入大中小括号,判断它们是否正确对应,例如:{[()]}是对应的,[(])是不对应的。
实现的方法就是将遇到的左括号都推入栈中,遇到右括号就将看其是否和栈顶元素对应,如果对应就将栈顶元素弹出,不对应就将这个括号放入栈中并报错,最后如果将所有栈元素都弹出,则说明所有括号都对应。
具体的实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct stack *Stack;
Stack create(int max);
char top(Stack s);
void pop(Stack s);
struct stack{
char *array;
int num;
};
Stack create(int max){
Stack s = (Stack)malloc(sizeof(struct stack));
s->array = (char*)malloc(sizeof(char)*max);
s->num = -1;
return s;
}
char top(Stack s){
return s->array[s->num];
}
void pop(Stack s){
s->num--;
}
void push(char x, Stack s){
s->num++;
s->array[s->num] = x;
}
bool isempty(Stack s){
return s->num == -1;
}
void dispose(Stack s){
free(s->array);
free(s->num);
}
int main(void)
{
char str[100];
int i;
gets(str);
int len = strlen(str);
Stack p = create(len);
for(i = 0; i <= len - 1; i++){
if(str[i] == '(' || str[i] == '[' || str[i] == '{'){
push(str[i],p);
}
if( str[i] == ')'){
if(top(p) == '(')
pop(p);
else{
push(str[i],p);
break;
}
}
else if( str[i] == ']'){
if(top(p) == '[')
pop(p);
else{
push(str[i],p);
break;
}
}
else if( str[i] == '}'){
if(top(p) == '{')
pop(p);
else{
push(str[i],p);
break;
}
}
}
if(isempty(p)) printf("balance");
else printf("unbalance");
dispose(p);
return 0;
}