http://acm.sdibt.edu.cn:8080/judge/contest/view.action?cid=316#problem/E
此题并不难,我觉得关键在于用栈顺序输出
#define STACK_INT_SIZE 100
#include <stdio.h>
#include <stdlib.h>
typedef char type;
typedef struct{
    type *base;
    type *top;
    int stacksize;
}stack;
//建栈
void initstack(stack *s){
    s->base=s->top=(type *)malloc(STACK_INT_SIZE*sizeof(type));
    s->stacksize=STACK_INT_SIZE;
}
//入栈
void push(stack *s,type e){
    *s->top++=e;
}
//出栈
int pop(stack *s,type *e){
    if(s->base==s->top)
        return 0;
    s->top–;
    *e=*(s->top);
    return 1;
}
//清空栈
void clearstack(stack *s){
    s->base=s->top;
}
//行编辑,得到的新栈s输出时是逆序的结果
void lineedit(stack *s){
    initstack(s);//建立栈s
    type ch;
    ch=getchar();//输入字符
    while(ch!=EOF){//判断是否为文件尾
        if(ch!=EOF&&ch!='\n'){//判断是否输入完毕
            switch(ch){
                case '#':pop(s,&ch);break;//若为#,则删去s栈中的栈顶元素
                case '@':clearstack(s);break;//若为@,则将s栈清为空
                default :push(s,ch);break;//其他情况就入栈
            }
        }
        ch=getchar();
    }
}
//输出栈,使用两个栈,将s栈中的元素导入s1,再输出就是顺序的结果
void print(stack *s,stack *s1){
    type ch;
    while(pop(s,&ch)!=0)
        push(s1,ch);
    while(pop(s1,&ch)!=0)
        printf("%c",ch);
}
int main(){
    stack s,s1;
    initstack(&s1);
    lineedit(&s);
    print(&s,&s1);
    return 0;
}

发表评论

电子邮件地址不会被公开。

Post Navigation