Top Banner
C Programming C Programming Basic – week 4 Basic – week 4
32

C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

Nov 14, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

C Programming C Programming Basic – week 4Basic – week 4

Page 2: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

2

Chủ đềChủ đề• Ngăn xếp

– Cài đặt dựa trên mảng– Cài đặt dựa trên danh sách liên

kết

• Bài tập

Page 3: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

3

Ngăn xếpNgăn xếp• Ngăn xếp là một cấu trúc dữ liệu tuyến

tính mà chỉ có thể truy cập ở một đầu để lưu trữ và truy vấn dữ liệu

• Cấu trúc LIFO (Last In First Out)

BA

DCBA

CBA

DCBA

EDCBAtop

toptop

toptop

top

Chèn và xóa phần tử trong ngăn xếp

Page 4: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

4

Các thao tác trên ngăn xếp• initialize(stack) --- xóa ngăn xếp• empty(stack) --- kiểm tra rỗng• full(stack) --- kiểm tra đầy• push(el,stack) --- đưa phần tử el

vào đầu ngăn xếp• pop(stack) --- lấy phần tử trên

cùng của ngăn xếp

• Cài đặt ngăn xếp ntn?L

I

F

O

pop push

empty

full

Page 5: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

5

Phân tách cài đặt vs đặc tảPhân tách cài đặt vs đặc tả• INTERFACE: (giao diện) cung cấp các

đặc tả của các thao tác • IMPLEMENTATION: (cài đặt) cung cấp

mã nguồn của thao tác• CLIENT: chương trình sử dụng các

thao tác • Cài đặt dựa trên mảng hoặc danh

sách liên kết• Client có thể làm việc ở mức trừu

tượng cao

Page 6: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

6

Cài đặt sử dụng mảngCài đặt sử dụng mảng

• Các phần tử được lưu trữ trên mảng• Ngăn xếp rỗng: top= 0• Ngăn xếp đầy: top = Max_Element

10 5 8 9

1 2 3 4 5 6 70

T: top

S

Page 7: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

7

Đặc tả ngăn xếp (stack.h)Đặc tả ngăn xếp (stack.h)Top of stack

#define Max 50typedef int Eltype;typedef Eltype StackType[Max];int top;

void Initialize(StackType stack);int empty(StackType stack); int full(StackType stack);void push(Eltype el, StackType stack);Eltype pop(StackType stack);

Page 8: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

8

Cài đặt ngăn xếp (stack.c)Cài đặt ngăn xếp (stack.c)

Initialize(StackType stack) push(Eltype el, StackType stack){ { top = 0; if (full(*stack))} printf(“stack overflow”);empty(StackType stack) else stack[top++] = el;{ } return top == 0; Eltype pop(StackType stack)} {full(StackType stack) if (empty(stack)){ printf(“stack underflow”); return top == Max; else return stack[--top];} }

Page 9: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

9

Cài đặt dựa trên cấu trúcCài đặt dựa trên cấu trúc• Ngăn xếp được khai báo như một cấu trúc

với hai trường: một để lưu trữ, một để quản lý vị trí trên cùng#define Max 50

typedef int Eltype;

typedef struct StackRec {

Eltype storage[Max];

int top;

};

typedef struct StackRec StackType;

Page 10: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

10

Cài đặt dựa trên cấu trúc Cài đặt dựa trên cấu trúc (2)(2)

Initialize(StackType *stack) push(Eltype el, StackType *stack){ { (*stack).top=0; if (full(*stack))} printf(“stack overflow”);empty(StackType stack) else (*stack).storage[ (*stack).top++]=el;{ } return stack.top ==0; Eltype pop(StackType *stack)} {full(StackType stack) if (empty(*stack)){ printf(“stack underflow”); return stack.top == Max; else return (*stack).storage[--

(*stack).top];;} }

Page 11: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

11

Biên dịch với thư việnBiên dịch với thư việnTa có các tệp stack.h, stack.c và test.c

Chèn dòng sau #include "stack.h" vào stack.c và test.c

gcc – c stack.cgcc –c test.cgcc – o test.out test.o stack.o

Page 12: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

12

Chương trình sử dụng Chương trình sử dụng ngăn xếpngăn xếp

• Viết chương trình chuyển đổi số thập phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp

• Mở rộng để chuyển đổi sang dạng thập lục phân

Page 13: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

13

Cài đặt dựa trên danh sách Cài đặt dựa trên danh sách liên kếtliên kết

• Điểm khác biệt giữa danh sách liên kết thông thường và ngăn xếp dựa trên danh sách liên kết là một số thao tác không thực hiện được

• Thao tác chèn: push().– Tương tự chèn vào đầu danh sách

• Thao tác xóa: pop()– Tương tự xóa ở đầu danh sách

Page 14: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

14

Khai báoKhai báo

struct node {

int data;

struct node *link;

};

Page 15: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

15

Push Push

struct node *push(struct node *p, int value)

{

struct node *temp;

temp=(struct node *)malloc(sizeof(struct node));

if(temp==NULL) {

printf("No Memory available Error\n");

exit(0);

}

temp->data = value;

temp->link = p;

p = temp;

return(p);

}

7

1

8

\

top

45

Temp

Page 16: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

16

Push (2) Push (2)

struct node *push(struct node *p, int value)

{

struct node *temp;

temp=(struct node *)malloc(sizeof(struct node));

if(temp==NULL) {

printf("No Memory available Error\n");

exit(0);

}

temp->data = value;

temp->link = p;

p = temp;

return(p);

}

7

1

8

\

top

45

Temp

Page 17: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

17

Push (3) Push (3)

struct node *push(struct node *p, int value)

{

struct node *temp;

temp=(struct node *)malloc(sizeof(struct node));

if(temp==NULL) {

printf("No Memory available Error\n");

exit(0);

}

temp->data = value;

temp->link = p;

p = temp;

return(p);

}

7

1

8

\

top

45

Temp

Page 18: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

18

PopPop

7

1

8

\

45

top Temp

struct node *pop(struct node *p, int *value)

{ struct node *temp; if(p==NULL) { printf(" The stack is empty can

not pop Error\n"); exit(0); } *value = p->data; temp = p; p = p->link; free(temp); return(p);}

Value at top element need to be save before pop operation

Page 19: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

19

Pop (2)Pop (2)

7

1

8

\

45

top Temp

struct node *pop(struct node *p, int *value)

{ struct node *temp; if(p==NULL) { printf(" The stack is empty can

not pop Error\n"); exit(0); } *value = p->data; temp = p; p = p->link; free(temp); return(p);}

Page 20: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

20

Pop (3)Pop (3)

7

1

8

\

top Temp

struct node *pop(struct node *p, int *value)

{ struct node *temp; if(p==NULL) { printf(" The stack is empty can

not pop Error\n"); exit(0); } *value = p->data; temp = p; p = p->link; free(temp); return(p);}

Page 21: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

21

Chú ýChú ý• Cài đặt hàm FreeStack trong thư viện

để xóa ngăn xếp

Page 22: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

22

Sử dụng ngăn xếpSử dụng ngăn xếp# include <stdio.h># include <stdlib.h>void main(){ struct node *top = NULL; int n,value; do { do { printf("Enter the element

to be pushed\n"); scanf("%d",&value); top = push(top,value); printf("Enter 1 to

continue\n"); scanf("%d",&n); } while(n == 1);

printf("Enter 1 to pop an element\n"); scanf("%d",&n); while( n == 1) { top = pop(top,&value); printf("The value poped is

%d\n",value); printf("Enter 1 to pop an element\n"); scanf("%d",&n); } printf("Enter 1 to continue\n"); scanf("%d",&n); } while(n == 1);}

Page 23: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

23

Sử dụng ngăn xếp (2)Sử dụng ngăn xếp (2)printf("Enter 1 to pop an element\n"); scanf("%d",&n); while( n == 1) { top = pop(top,&value); printf("The value poped is %d\n",value); printf("Enter 1 to pop an element\n"); scanf("%d",&n); } printf("Enter 1 to continue\n"); scanf("%d",&n); } while(n == 1);}

Page 24: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

24

Exercise 4.1Exercise 4.1• Sử dụng ngăn xếp để viết chương

trình nhận vào một xâu và đảo ngược xâu đó

Page 25: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

25

Homework 1• Viết chương trình yêu cầu người dùng nhập vào

hai số nguyên dương và tính tổng hai số đó. Lưu số nhập vào dưới dạng chuỗi các chữ số. Sử dụng ngăn xếp để thực hiện phép cộng.

3

2

7

8

92

6

5

+ =

8732 + 5629 = 14361

1

6

34

1

Page 26: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

26

Gợi ýĐọc các chữ số của số đầu tiên và lưu vào một ngăn

xếpĐọc các chữ số của số thứ hai và lưu vào một ngăn

xếp khácresult=0;while ít nhất một ngăn xếp còn chưa rỗng lấy mỗi chữ số từ ngăn xếp và tính tổng đẩy tổng (-10 nếu dư) vào ngăn xếp kết quả; lưu số nhớ vào result;đưa số nhớ vào ngăn xếp kết quả nếu khác 0lấy các chữ số từ ngăn xếp kết quả và hiển thị

Page 27: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

27

Exercise 4.2Exercise 4.2• Xây dựng danh bạ điện thoại• Khai báo cấu trúc "Address" chứa ít nhất "name",

"telephone number" và "e-mail address".• Viết chương trình sao chép danh bạ từ một tệp

sang tệp khác, sử dụng ngăn xếp. Đầu tiên, đọc danh bạ từ tệp vào đưa vào một ngăn xếp. Sau đó lấy các bản ghi ra khỏi ngăn xếp và ghi vào tệp.

Page 28: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

28

Exercise 4.3Exercise 4.3• Viết chương trình chuyển một biểu thức từ dạng infix sang

dạng reverse polish. Biểu thức bao gồm các toán hạng là các số nguyên dương (từ 1 tới 9) và bốn toán tử (+, -, *, /). Đọc một biểu thức ở dạng infix từ bàn phím, chuyển sang dạng reverse polish và in ra màn hình.

• Ví dụ,

3+5*4là đầu vào, đầu ra có dạng

3 5 4 * +

Page 29: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

29

STACK.hSTACK.hvoid STACKinit(int);int STACKempty();void STACKpush(Item);Item STACKpop();

Page 30: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

30

STACK.cSTACK.c#include <stdlib.h>#include "Item.h"#include "STACK.h"static Item *s;static int N;void STACKinit(int maxN) { s = malloc(maxN*sizeof(Item)); N = 0; }int STACKempty() { return N == 0; }void STACKpush(Item item) { s[N++] = item; }Item STACKpop() { return s[--N]; }

Page 31: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

31

Exercise 4.4Exercise 4.4• Viết chương trình tính một biểu thức

dạng postfix bao gồm phép nhân và phép cộng các số nguyên.

• Ví dụ:

• ./posteval 5 4 + 6 * => 54

Page 32: C Programming Basic...phân sang dạng nhị phân tương ứng sử dụng thư viện ngăn xếp •Mở rộng để chuyển đổi sang dạng thập lục phân 13 Cài đặt

32

Homework 2Homework 2• Viết chương trình cho phép nhân số

lớn

• Gợi ý: Chia số lớn thành các đoạn độ dài 3 (hoặc length-k). Thực hiện phép nhân như bình thường và cộng kết quả