输入一行打印一行
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef char SElemType;
//栈结构体
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
int InitStack(SqStack* S);//初始化栈
int Push(SqStack* S, SElemType e);//入栈
int Pop(SqStack* S, SElemType* e);//删除栈中的元素
int DestoryStack(SqStack* S);//销毁栈
void LineEdit(SqStack* S);//行编辑程序
int ClearStack(SqStack* S);//清空栈中的元素
int main()
{
SqStack sq;
int f;
LineEdit(&sq);//进行括行编辑
DestoryStack(&sq);//将栈销毁
return 0;
}
//初始化栈
int InitStack(SqStack* S) {
S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base) {
exit(OVERFLOW);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
//入栈
int Push(SqStack* S, SElemType e) {
if ((S->top - S->base) >= S->stacksize) {
S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S->base) {
exit(OVERFLOW);
}
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
//printf("%c\n",e);
return OK;
}
//删除栈中的元素
int Pop(SqStack* S, SElemType* e) {
if (S->top == S->base) return ERROR;
*e = *--S->top;
return OK;
}
//清空栈中的元素
int ClearStack(SqStack* S) {
S->top = S->base;
return OK;
}
//销毁栈
int DestoryStack(SqStack* S) {
S->top = S->base;
free(S->base);
S->top = NULL;
S->base = NULL;
return OK;
}
//行编辑程序
void LineEdit(SqStack* S) {
SElemType* p, ch, c;
InitStack(S);
ch = getchar();
while (ch != EOF) {
while (ch != EOF&& ch != '\n') {
switch (ch) {
case '#':Pop(S, &c); break;
case '@':ClearStack(S); break;
default:Push(S, ch); break;
}
ch = getchar();
}
p = S->base;
while (p != S->top) {
printf("%c", *p);
++p;
}
putchar('\n');
ClearStack(S);
if (ch != EOF) ch = getchar();
}
}