30/09/2018, 23:13

[Hỏi] Ứ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ý ạ
Em cảm ơn rất nhiều!

Nguyễn Tuấn Nam viết 01:15 ngày 01/10/2018

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");

	???????
}
NhatTa viết 01:15 ngày 01/10/2018

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

Nguyễn Tuấn Nam viết 01:14 ngày 01/10/2018

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);
Nguyễn Tuấn Nam viết 01:18 ngày 01/10/2018

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ó

Nguyễn Tuấn Nam viết 01:27 ngày 01/10/2018

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

Quân viết 01:29 ngày 01/10/2018

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

Nguyễn Tuấn Nam viết 01:16 ngày 01/10/2018

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

Nguyễn Tuấn Nam viết 01:24 ngày 01/10/2018
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 ạ?

Quân viết 01:15 ngày 01/10/2018

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é
Nguyễn Tuấn Nam viết 01:15 ngày 01/10/2018

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 ạ?

Quân viết 01:16 ngày 01/10/2018

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

Bài liên quan
0