數據結構C-6-棧的應用(數制轉換、括號匹配、行編輯、簡單表達式計算)

1.數制轉換

//數制轉換
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef struct Stack{
    ElemType *base;
    ElemType *top;
    int size;
}Stack;
void InitStack(Stack *s);
void Push(Stack *s,ElemType e);
void Pop(Stack *s,ElemType *e);
void Conversion(int n,int d);
int main(void){
    int n,r;
    printf("請輸入十進制數:");
    scanf("%d",&n);
     printf("請輸入轉換的制數:");
     scanf("%d",&r);
     Conversion(n,r);
    return 0;
}
void InitStack(Stack *s){
    s->base=(ElemType*)malloc(sizeof(ElemType));
    if(!s->base)
        exit(-1);
    s->top=s->base;
    s->size=MAX_SIZE;
}
void Push(Stack *s,ElemType e){
    if(s->top-s->base>=MAX_SIZE){
        s->base=(ElemType*)realloc(s->base,(s->size+STACKINCREMENT)*sizeof(ElemType));
        if(!s->base)
            exit(-1);
        s->top=s->base+s->size;
        s->size+=STACKINCREMENT;
    }
    *s->top++=e;
}
void Pop(Stack *s,ElemType *e){
    if(s->base==s->top)
        exit(-1);
    s->top--;
    *e=*s->top;
}
//將十進制整數n轉換爲d進制
void Conversion(int n,int d){
    Stack s;
    ElemType e;
    InitStack(&s);
    while(n){
        Push(&s,n%d);
        n/=d;
    }
    while(!(s.top==s.base)){
        Pop(&s,&e);
        printf("%d",e);
    }
    printf("\n");
}

2.括號匹配

//括號匹配
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
#define STACKINCREMENT 10
typedef char ElemType;
typedef int Status;
typedef struct Stack{
    ElemType  *base;
    ElemType *top;
    int size;
}Stack;

void InitStack(Stack *s);
int StackEmpty(Stack s);
void Push(Stack *s,char e);
void Pop(Stack *s,char *e);
void GetTop(Stack *s,char *e);
void Match(char *ch);

int main(void){
    char strr[50];
    printf("請輸入各種括號\n");
    gets(strr);
    Match(strr);
    return 0;
}
void InitStack(Stack *s){
    s->base=(ElemType*)malloc(sizeof(ElemType));
    if(!s->base)
        exit(-1);
    s->top=s->base;
    s->size=MAX_SIZE;
}
int StackEmpty(Stack s){
    if(s.base==s.top)
        return 1;
    else return 0;
}
void Push(Stack *s,char e){
    if(s->top-s->base>=MAX_SIZE){
        s->base=(ElemType*)realloc(s->base,(s->size+STACKINCREMENT)*sizeof(ElemType));
        if(!s->base)
            exit(-1);
        s->top=s->base+s->size;
        s->size+=STACKINCREMENT;
    }
    *s->top++=e;
}
void Pop(Stack *s,char *e){
    if(StackEmpty(*s))
        exit(-1);
    s->top--;
    *e=*s->top;
}
//獲取棧頂元素
void GetTop(Stack *s,char *e){
    if(StackEmpty(*s))
        exit(-1);
    *e=*(s->top-1);
}
//括號匹配
void Match(char *ch){
    Stack s;
    InitStack(&s);
    char x;
    for(int i=0;ch[i]!='\0';i++){
        if(ch[i]=='('||ch[i]=='['||ch[i]=='{')
            Push(&s,ch[i]);
        if(ch[i]==')'||ch[i]==']'||ch[i]=='}'){
            if(StackEmpty(s)){
                printf("右括號比左括號多\n");return ;
            }

            else{
                    GetTop(&s,&x);
                    if((ch[i]==')'&&x=='(')||(ch[i]==')'&&x=='(') ||(ch[i]==')'&&x=='('))
                        Pop(&s,&x);
                    else{
                        printf("左右括號不同類\n");return;
                    }

            }
        }
    }
    if(StackEmpty(s))
        printf("括號匹配\n");
    else
        printf("左括號比右括號多\n");
}

3.行編輯

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 100
#define STACKINCREMENT 10
typedef char ElemType;
typedef int Status;
typedef struct Stack{
    ElemType  *base;
    ElemType *top;
    int size;
}Stack;

void InitStack(Stack *s);
void ClearStack(Stack *s);
void DestroyStack(Stack s);
int StackEmpty(Stack s);
void Push(Stack *s,char e);
void Pop(Stack *s,char *e);
void GetTop(Stack *s,char *e);
void Display(Stack s);

int  main(){
    Stack s;
    InitStack(&s);
    char ch;
    printf("請輸入文本(#:退格;@清行):\n");
    ch=getchar();
    while(ch!=EOF){//結束
        while(ch!=EOF&&ch!='\n'){
            switch(ch){
                case '#':Pop(&s,&ch);break;
                case '@':ClearStack(&s);break;
                default:Push(&s,ch);break;
            }
            ch=getchar();
        }
        printf("該行實際文本爲:\n");
        Display(s);
        ClearStack(&s);
        if(ch!=EOF)
            ch=getchar();
    }
    printf("\n");
    DestroyStack(s);
    return 0;
}

void InitStack(Stack *s){
    s->base=(ElemType*)malloc(sizeof(ElemType));
    if(!s->base)
        exit(-1);
    s->top=s->base;
    s->size=MAX_SIZE;
}
void ClearStack(Stack *s){
    s->top=s->base;
}
void DestroyStack(Stack s){
    if(!s.base)
        free(s.base);
    s.base=NULL;
    s.top=NULL;
    s.size=0;
}
int StackEmpty(Stack s){
    if(s.base==s.top)
        return 1;
    else return 0;
}
void Push(Stack *s,char e){
    if(s->top-s->base>=MAX_SIZE){
        s->base=(ElemType*)realloc(s->base,(s->size+STACKINCREMENT)*sizeof(ElemType));
        if(!s->base)
            exit(-1);
        s->top=s->base+s->size;
        s->size+=STACKINCREMENT;
    }
    *s->top++=e;
}
void Pop(Stack *s,char *e){
    if(StackEmpty(*s))
        exit(-1);
    s->top--;
    *e=*s->top;
}
//獲取棧頂元素
void GetTop(Stack *s,char *e){
    if(StackEmpty(*s))
        exit(-1);
    *e=*(s->top-1);
}
void Display(Stack s){
    if(StackEmpty(s))
        printf("棧爲空\n");
    else{
        ElemType *p;
        p=s.base;
        while(p!=s.top){
            printf("%c",*p);p++;
        }
        printf("\n");
    }
}

4.簡單表達式計算

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
#define STACKINCREMENT 10

typedef struct {
    char  *base;
    char *top;
    int size;
}SqStack_OPTR;//操作符
typedef struct {
    int  *base;
    int *top;
    int size;
}SqStack_OPND;//操作數
void InitStack_OPND(SqStack_OPND *s);
void InitStack_OPTR(SqStack_OPTR *s);
void Push_OPTR(SqStack_OPTR *s,char e);
void Push_OPND(SqStack_OPND *s,int e);
char Pop_OPTR(SqStack_OPTR *s);
int Pop_OPND(SqStack_OPND *s);
char GetTop_OPTR(SqStack_OPTR *s);
char GetTop_OPND(SqStack_OPND *s);
char get_priority(char a,char b);
int Operate(int a,char theata,int b);
int In(char c);
int EvaluteExpress();
int  main(){
    printf("請輸入表達式(以#結尾):");
    int result=EvaluteExpress();
    printf("表達式結果是:%d",result);
    return 0;
}

void InitStack_OPND(SqStack_OPND *s){
    s->base=(int*)malloc(MAX_SIZE*sizeof(int));
    if(!s->base)
        exit(-1);
    s->top=s->base;
    s->size=MAX_SIZE;
}
void InitStack_OPTR(SqStack_OPTR *s){
    s->base=(char*)malloc(MAX_SIZE*sizeof(char));
    if(!s->base)
        exit(-1);
    s->top=s->base;
    s->size=MAX_SIZE;
}
void Push_OPTR(SqStack_OPTR *s,char e){
    if(s->top-s->base>MAX_SIZE){
        s->base=(char*)realloc(s->base,(s->size+STACKINCREMENT)*sizeof(char));
        if(!s->base)
            exit(-1);
        s->top=s->base+s->size;
        s->size+=STACKINCREMENT;
    }
    *s->top++=e;
}
void Push_OPND(SqStack_OPND *s,int e){
    if(s->top-s->base>MAX_SIZE){
        s->base=(int*)realloc(s->base,(s->size+STACKINCREMENT)*sizeof(int));
        if(!s->base)
            exit(-1);
        s->top=s->base+s->size;
        s->size+=STACKINCREMENT;
    }
    *s->top++=e;
}
char Pop_OPTR(SqStack_OPTR *s){
    if(s->top==s->base)
        exit(-1);
    s->top--;
    char e;
    e=*s->top;
    return e;
}
int Pop_OPND(SqStack_OPND *s){
    if(s->top==s->base)
        exit(-1);
    int e;
    s->top--;
    e=*s->top;
    return e;
}
//獲取棧頂元素
char GetTop_OPTR(SqStack_OPTR *s){
    if(s->base==s->top)
        exit(-1);
    return *(s->top-1);
}
char GetTop_OPND(SqStack_OPND *s){
    if(s->base==s->top)
        exit(-1);
    return *(s->top-1);
}
//獲取優先級
char get_priority(char a,char b){
    char c;
    switch(a){
        case '+':
        case '-':
            if(b=='*'||b=='/'||b=='(') c='<';
            else c='>';
            break;
        case '*':
        case '/':
            if(b=='(') c='<';
            else c='>';
            break;
        case '(':
            if(b=='#'){
                printf("缺少右括號!\n");
                return -1;
               }
            else if(b==')') c='=';
            else c='<';
            break;
        case ')':
            if(b=='('){
                printf("括號不匹配!\n");
                return -1;
               }
            else
                c='>';
            break;
        case '#':
            if(b==')'){
                printf("缺少左括號!\n");
                return -1;
            }
            else if(b=='#')
                c='=';
            else
                c='<';
            break;
    }
    return c;
}
//單項計算
int Operate(int a,char theata,int b){
    switch(theata){
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        if(b==0){
            printf("被0除錯誤\n");
            exit(-1);
        }
        else
            return a/b;
    }
    return 0;
}
//是否進棧
int In(char c){
    switch(c){
        case '+':
        case '-':
        case '*':
        case '/':
        case '(':
        case ')':
        case '#':
            return 1;
    }
    return 0;
}
//計算進棧
SqStack_OPND OPND;SqStack_OPTR OPTR;
int EvaluteExpress(){
    InitStack_OPND(&OPND);
    InitStack_OPTR(&OPTR);
    Push_OPTR(&OPTR,'#');
    char c;c=getchar();char x;
    char e;
    int a,b;char theta;
    if( c == '#' && GetTop_OPTR(&OPTR) == '#' ){
        printf( "空表達式。\n" );return -1;
    }
    while( c != '#'||GetTop_OPTR(&OPTR)!='#'){
        if(c>='0'&&c<='9'){
             Push_OPND(&OPND,c-'0');c=getchar();
        }
        else if(c==' '||c=='\t'||c=='\n'){
            c=getchar();continue;
        }
        else if(In(c)){//操作數,進棧
            e=GetTop_OPTR(&OPTR);
             switch(get_priority(e,c)){
                case '<'://棧頂元素優先級低
                    Push_OPTR(&OPTR,c);//進棧
                    c=getchar();
                    break;
                case '=':
                    x=Pop_OPTR(&OPTR);
                    c=getchar();
                    break;
                case '>':
                    theta=Pop_OPTR(&OPTR);
                    a=Pop_OPND(&OPND);
                    b=Pop_OPND(&OPND);
                    Push_OPND(&OPND,Operate(b,theta,a));
                    break;
            }
        }
        else {
            printf("出現非法字符\n");
            return -1;
        }
    }
    return GetTop_OPND(&OPND);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章