考研数据结构与算法之利用堆栈实现行编辑程序

今天我的博客终于迎来了第一位关注着,但是同时我也发现了之前的程序在出栈时是有一些问题的,但是还没找到确切的原因,然后这一段代码是今天晚上实现的行编辑的demo,但是现在是不完善的,明天或者后天我将会将它彻底修复。

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct Node
{
	Node *next;
	char c;
}*StackElem;
typedef struct Stack
{
	StackElem base;
	StackElem top;
	int length;
};
Status InitStack(Stack *S);
Status Push(Stack *S, char c);
Status Pop(Stack *S, char *c);
Status GetTop(Stack S, char *c);
Status ClearStack(Stack *S);
Status StackEmpty(Stack S);
int main(void)
{
	Stack S,T;
	InitStack(&S);
	InitStack(&T);
	char c;
	scanf("%c",&c);
	while(c != '*')
	{
		switch(c)
		{
			case '#':
				if(!StackEmpty(S))
				{
					Pop(&S, &c);
				}else
					Push(&S, '#');
				break;
			case '@':
				ClearStack(&S);
				break;
			default:
				Push(&S, c);
		}
		scanf("%c",&c);
	}
	while(!StackEmpty(S))
	{
		Pop(&S, &c);
		Push(&T, c);
	}
	while(!StackEmpty(T))
	{
		Pop(&T, &c);
		printf("%d",c);
	}
	system("pause");
}
Status InitStack(Stack *S)
{
	S->base = (StackElem)malloc(sizeof(StackElem));
	S->base->next = NULL;
	S->top = S->base;
	S->length = 0;
	return OK;
}
Status Push(Stack *S, char c)
{
	if(!S->base)
		return ERROR;
	StackElem q = (StackElem)malloc(sizeof(StackElem));
	(S->top)->c = c;
	q->next = S->top;
	S->top = q;
	S->length++;
	return OK;
}
Status Pop(Stack *S, char *c)
{
	if(S->base == S->top)
		return ERROR;
	*c = S->top->next->c;
	StackElem q = S->top->next;
	//free(S->top);
	S->top = q;
	S->length--;
	return OK;
}
Status GetTop(Stack S, char *c)
{
	if(S.base == S.top)
		return ERROR;
	*c = S.top->next->c;
	return OK;
}
Status ClearStack(Stack *S)
{
	S->top = S->base;
	S->length = 0;
	return OK;
}
Status StackEmpty(Stack S)
{
	if(S.length == 0)
		return TRUE;
	return FALSE;
}

不过令我很得意的是,我还是对严蔚敏的程序做了一点小小的修改,使他更加强大了一些。

PS:刚刚经女神大人的提醒终于发现了错误之所在,原来要利用一个getchar()来抹掉回车的字符才能够正常使用,嗯就是这样!。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值