第十四周一周总结

来源:互联网 发布:淘宝公益宝贝产品好吗 编辑:程序博客网 时间:2024/05/18 22:51

这周我主要对栈方面的内容进行了学习,栈其实是一个只能在末端删除和插入的表,它的特点就是后进先出(或者叫先进后出)。栈可以用链表来实现,也可以用数组来实现,数组实现栈会比链表实现更简单一些,并且运算的速度也会快很多,唯一的弊端就是它需要提前声明一个数组的大小,但大多数时候这不会造成太大的影响,所以我主要对数组实现栈进行了学习。

在进行栈操作前,我们先要建立一个结构体,包括一个数组和一个头位置的数,即

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;}



原创粉丝点击