1. 程式人生 > >考研資料結構與演算法之利用堆疊實現行編輯程式

考研資料結構與演算法之利用堆疊實現行編輯程式

今天我的部落格終於迎來了第一位關注著,但是同時我也發現了之前的程式在出棧時是有一些問題的,但是還沒找到確切的原因,然後這一段程式碼是今天晚上實現的行編輯的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()來抹掉回車的字元才能夠正常使用,嗯就是這樣!。