Hỏi về ứng dụng Stack cài đặt bằng ngôn ngữ C

Em đang nghiên cứu về các ứng dụng của Stack và thấy có ứng dụng kiểu undo.
Câu hỏi đặt ra là em có 1 file input có nội dung:

nguyen
tuan
undo
nam
undo
undo
nam
anh

==> xuất ra file output là:

nguyen
nam
anh

Ai có thể giúp em phần xử lý ạ :confused:
Em cảm ơn rất nhiều!

em đã cài đặt stack bằng mảng:

void KhoiTao(Stack *stack)
{
	stack->top = 0;
}

int  KTRong(Stack stack)
{
	return (stack.top == 0);
}

int KTFull(Stack stack)
{
	return (stack.top == 100);
}

void Push(Stack *stack, string s)
{
	if(!KTFull(*stack))
	{
		strcpy(stack->data[stack->top], s);
		stack->top++;
	}
}

void Pop(Stack *stack)
{
	if(!KTRong(*stack))
	{
		stack->top--;
	}
}

void XuLy(Stack *stack)
{
	char s[256]; int i = 0;
	FILE *fin = fopen("file\\input.txt", "rt");
	FILE *fout = fopen("file\\output.txt", "wt");

	???????
}

Logic từ file input ra output là gì? bạn biêtd không

Sư huynh xem cho em cái đọc file từ input gán nó vô stack thế này ổn không?

while(!feof(fin))
	{
		fgets(s, 256, fin);
		if(strcmp(s,"undo\n") == 0)
		{
			Pop(stack);
		}
		else
		{
			Push(stack, s);
		}
	}

	fclose(fin);

Stack không cho phép ta duyệt tuần tự mà phải đi từ top xuống. nếu như từ file input -> output nó sẽ ngược và em vẫn chưa thể biết làm như thế nào để xử lý nó

ai giúp em trả lời những câu hỏi :3

cách 1: cài đặt iterator cho stack là xong.
cách 2: copy stack sang stack khác. có gì đâu nhỉ

cài như thế nào ạ sư huynh :confused: em thấy khó khăn quá :3

hile(!feof(fin))
	{
		fgets(s, 256, fin);
		if(strcmp(s,"undo\n") == 0)
		{
			Pop(stack);
		}
		else
		{
			Push(stack, s);
		}
	}

	fclose(fin);

Vậy code này ghi file vô stack thế này ổn không ạ?

tạo struct Iterator với đặc tả như sau:

Iterator{
    Stack *stack
    int current;
}

tạo method

*Iterator iterator(Stack *pStack){
    Iterator iterator;
    Iterator *pIterator = &iterator;
    pIterator->current = 0;
    pIterator->stack = pStack;
    return pIterator;
}

method duyệt:

void Duyet(Iterator *pIterator){
    int stackSize = pIterator->stack->top;
    if (stackSize == 0){
        return;
    }
    while (pIterator->current <= stackSize){
        YourData data = pIterator->stack->data[pIterator->current];
        // do something
        pIterator->current++;
    }
}

mình viết sơ vậy thôi, bạn cải tiến thêm nhé

2 Likes

cảm ơn sư huynh để em nghiên cứu thêm. còn cách khác là đọc file input gán vào 1 stack rồi duyệt stack gán nó vô stack mới rồi ghi ra file output đúng không ạ?

1 Like

bạn có thể pop từ stack này push sang stack kia là nó cũng xếp ngược lại cho mình, nhưng tốn memory hơn, với cả sẽ tăng số chỉ dẫn cần thực hiện của thuật toán do phải dùng vòng lặp nhiều lần hơn

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?