#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 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;//s-- 就是进行栈顶的降低
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) //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;
}
ClearStack(S);
if (ch != EOF) ch = getchar();
}
}
int main()
{
SqStack sq;
int f;
LineEdit(&sq);//进行括行编辑
DestoryStack(&sq);//将栈销毁
return 0;
}
#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 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;//s-- 就是进行栈顶的降低
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) //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;
}
ClearStack(S);
if (ch != EOF) ch = getchar();
}
}
int main()
{
SqStack sq;
int f;
LineEdit(&sq);//进行括行编辑
DestoryStack(&sq);//将栈销毁
return 0;
}