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