极客 - 博文20 - 符号平衡问题

来源:互联网 发布:网络打字员工作 编辑:程序博客网 时间:2024/06/05 15:17
*程序名称: 符号平衡问题
*作者: 田鑫  
*完成日期: 2016 - 09 - 25  
*版本号: v1.0 
*平台: DEV C++ 
*问题描述: 检测输入的符号是否匹配
*解决方法: 利用堆栈实现
#include <stdio.h>#include <stdlib.h>struct stack{    char character;    struct stack *next;};typedef struct stack STACK, *PSTACK;int checkSymbol(PSTACK s);/*平衡符号匹配检测*/PSTACK createStack(void);/*创建空栈*/int isEmpty(PSTACK s);/*测试栈是否是空栈*/void push(PSTACK s, char ch);   /*元素入栈*/void pop(PSTACK s);/*元素出栈*/char top(PSTACK s);/*获取栈顶元素*/void freeStack(PSTACK s);/*释放栈元素*/int main(void){    PSTACK s = NULL;    s = createStack();printf("\t\t符号匹配状态\n");    if(checkSymbol(s)){printf("\t\t---NO!---\n");}    else{        printf("\t\t---Yes!---\n");}    freeStack(s);/*调用完成清空栈所有元素*/    return 0;}int checkSymbol(PSTACK s){    char ch;    while((ch = getchar()) != '\n')/*从文件读取数据, #为文件尾*/    {        if((ch == '{')||(ch == '[')||(ch == '(')) /*如果是左括号,压栈*/        {            push(s, ch);        }        else if((ch == '}')||(ch == ']')||(ch == ')'))/*符号匹配*/         {            if(isEmpty(s))return 1;            else            {                switch(ch)                {case '}':if(top(s)!='{')/*匹配失败*/{return 1;}elsebreak;case ')':if(top(s)!='('){return 1;}elsebreak;case ']':if(top(s)!='['){return 1;}else break;                }                pop(s);/*匹配成功 删除符号*/            }        }    }    if(!isEmpty(s))/*栈里如果还有字符,则符号未匹配完*/return 1;    else        return 0;}PSTACK createStack(void){    PSTACK s;    s = (PSTACK)malloc(sizeof(STACK));    if(s == NULL){        printf("内存分配失败!\n");exit(0);}    s->next = NULL;    return s;}int isEmpty(PSTACK s){    return (s->next==NULL);}void push(PSTACK s, char ch){    PSTACK temp = (PSTACK)malloc(sizeof(STACK));temp->next = NULL;    if(!temp){printf("内存分配失败!");exit(0);}    temp->character = ch;    temp->next = s->next;    s->next = temp;}void pop(PSTACK s){    PSTACK temp = NULL;    if(isEmpty(s))     {printf("栈空!\n");}    else    {        temp=s->next;        s->next=temp->next;        free(temp);    }}char top(PSTACK s){    if(!isEmpty(s)){        return (s->next->character);}    printf("empty stack.");    return 0;}void freeStack(PSTACK s){PSTACK temp;while(s != NULL){temp = s;s = s->next;free(temp);}}

运行结果




1 0
原创粉丝点击