1. Trang chủ
  2. » Đề thi

DecuongOntapCTDLdoc

18 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 35,06 KB

Nội dung

Hãy viết một thủ tục/hàm tạo một danh sách liên kết đơn từ cây nhị phân tìm kiếm sao cho giá trị các phần tử trong danh sách có thứ tự tăng dần. Biết gốc của cây là ROOT.. Câu 27[r]

(1)

CÂU HỎI ÔN TẬP MÔN CẤU TRÚC DỮ LIỆU

Câu 1

Ta có đối tượng:

Điểm (pixel): bao gồm toạ độ x, tọa độ y.

Đoạn thẳng (line): xác định điểm (x1, y1) điểm bắt đầu – (x2, y2) điểm kết thúc.

Hình chữ nhật (rectangle): xác định điểm (x1, y1) góc bên trái – (x2,y2) góc bên phải. Hình trịn (circle): xác định điểm (x, y) tâm; R bán kính.

Hãy định nghĩa (bằng C/PASCAL) kiểu liệu cho đối tượng mà anh(chị) cho hợp lý nhất.

typedef struct pixel {

int x,y; }Point;

Typedef struct {

Point A; Point B; }Line;

Typedef struct {

Point TopLeft; Point BottomRight; }Rectangle;

Typedef struct {

Point Center; Int R

}Circle; Câu 2

a) Hãy viết đoạn chương trình yêu cầu ngừơi dùng nhập vào số nguyên N tiến hành cấp phát mảng động chứa N số kiểu long.

b) Cho cấu trúc DEMO gồm có field sau: struct DEMO

{ int one;

long two; char three[10]; }

Hãy khai báo biến trỏ p với kiểu DEMO; cấp phát nhớ cho trỏ p; gán vào field p giá trị sau {1, 500000, “Hello”}

a) Long *mangdong(void) {

Int n; Long *p;

Printf(“\n Nhap so phan tu cua mang: ”) ; scanf(“%d”,&n); p=(long*)calloc(n, sizeof(long));

if(p==NULL) {

Printf(“\n Khong cap phat duoc bo nho”); Exit(1);

}

(2)

b) Khai bao bien tro kieu DEMO Struct DEMO *P; Cap phat bo nho cho tro P

P=(Struct DEMO*)malloc(sizeof(struct DEMO)); Gan gia tri cho cac phan cua P

P->one=1; P->two=500000;

Strcpy(p->three,”Hello”);

Caâu

Cho dãy số: 32 17 45 26 10 50 22 15

a) Áp dụng thuật tốn tạo nhị phân tìm kiếm để tạo từ dãy số b) Viết thủ tục duyệt để kết in dãy số tăng dần

c) Viết thủ tục thực đảo nhánh

Bài giải

C) Void DaoNhanh(Nodeptr &Root) {

Nodeptr T; If(Root==NULL)

Return 0; If(Root!=NULL)

{

T=Root->pLeft;

Root->pLeft=Root->pRight; Root->pRight=T;

DaoNhanh(Root->pLeft); DaoNhanh(Root->pRight); }

}

Câu 4

Cho danh sách liên kết đơn sau:

a p1 = pHead->pNext; b p3 = p1->pNext->pNext; c p3->data = p1->data; d pCurr = p1;

while (pCurr != NULL) {

pCurr->data *= 5; pCurr = pCurr->pNext; }

Ứng với trường hợp [a] – [d], vẽ lại danh sách, thể rõ thay đổi.

Đã giải (tài liệu photo)

Câu 5

a) Cho biết khác cấu trúc ngăn xếp hàng đợi b) Cho ngăn xếp s, hàng đợi q đoạn chương trình sau:

struct STACK s; struct QUEUE q; int x = 2, y = 5; for (int i=1; i<=y; i++)

(3)

while (IsEmpty(q) == 0)

{ pop(q,x); push(s,x); printf(“%5d“,x);

}

while (IsEmpty(s) == 0)

{ pop(s,x); push(q,x);

}

while (IsEmpty(q) == 0)

{ pop(q,x); printf(“%5d“,x);

}

Hãy cho biết kết in hình thi hành đoạn chương trình ? Câu 6

Cho nhị phân tìm kiếm chứa số nguyên Viết thủ tục tính giá trị trung bình nút chứa số nguyên tố Câu 7

Ta có 100.000 từ tiếng Anh, từ dài không 10 ký tự Giả sử máy tính bạn có 1MB nhớ cịn trống

Hãy cho biết cấu trúc liệu dùng để lưu tồn liệu nói ? Lý giải lựa chọn bạn (ngắn gọn) Khai báo cấu trúc C/PASCAL (Lưu ý: kích thước mảng không vượt 65535 bytes)

Câu 8

Cho dãy số: 32 17 15 26 30 50

a) Hãy xây dựng AVL cách thêm số từ dãy số vào cây, nêu bước thực vẽ trường hợp

b) Viết thủ tục so sánh cấu trúc hai AVL Câu 9

Cho danh sách liên kết đơn

a) Viết thủ tục loại bỏ phần tử trùng (giữ lại phần tử) danh sách b) Viết thủ tục đảo ngược xâu liên kết

Câu 10

Cho nhị phân tìm kiếm hình vẽ Hãy cho biết thứ tự phần tử thêm vào để có cấu trúc ? (Giả sử lúc đầu rỗng)

Nếu kết phép duyệt là: 3, 7, 9, 5, 12, 20, 18, 15, 10 Hãy cho biết người ta áp dụng phép duyệt ? Câu 11

Viết thủ tục tách danh sách chứa số nguyên thành hai danh sách: danh sách gồm số chẳn chứa số lẻ

//khai bao cau truc typedef struct Node {

int Data;

struct Node *Next;//khai bao mot node bang de qui }NodeType;

typedef Nodetype *Nodeptr;

nodeptr Head,Even,Odd,Result; // Even: chẵn; Odd: lẻ void InsertListOrder(nodeptr P,nodeptr &Head) {

nodeptr a,b; a=b=Head;

if (Head==NULL) Head=P; while (a!=NULL && a->Data< P->Data)

{

(4)

a=a->Next; }

if (a==Head) {

P->Next=a; Head=P; }

else {

P->Next=a; b->Next=P; }

}

void SpitList(Nodeptr &Head,Nodeptr &Even,nodeptr &Odd) //ham tach danh sach {

Nodeptr P; Even=Odd=NULL; //P=Head; while(Head!=NULL) {

P=Head; Head=P->Next; P->Next=NULL;

if (P->Data%2==0) InsertListOrder(P,Even); else InsertListOrder(P,Odd);

//p=p->next; }

}

Câu 12

Cho đa thức P(x)= anXn + an-1Xn-1 + + a1X + a0 D) Hãy cài đặt cấu trúc liệu để lưu trữ đa thức E) Viết thủ tục cộng hai đa thức

F) Viết thủ tục lấy đạo hàm đa thức

Đã giải (Tài liệu photo)

Câu 13

Cho khoá : 18 320 46 13 27

Giả sử bảng có kích thước m=7, hàm băm h(k) = k mod Hãy dùng hình vẽ minh hoạ tình trạng bảng băm sau khoá đưa vào nói rõ cách giải đụng độ địa phương pháp dị tuyến tính

Câu 14

Viết thủ tục chuyển danh sách liên kết kép thành nhị phân tìm kiếm, khơng cấp phát thêm nhớ, thay đổi liên kết

Câu 15

Viết thủ tục dùng ngăn xếp để đổi số thập phân sang số thập lục phân ngược lại Câu 16

Hãy chọn cấu trúc liệu thích hợp để biểu diễn nhớ từ điển tần số gồm tối đa 1000 từ, từ có độ dài 10 ký tự, kèm với từ số lần xuất từ (đã thu thập từ số văn đó)

Cấu trúc liệu phải thoả yêu cầu :

 Thời gian truy cập đến từ tối thiểu  Bộ nhớ dùng tối thiểu

Câu 17

Cho hai nhị phân tìm kiếm trỏ trỏ T1 T2

(5)

b) viết thủ tục tính giá trị trung bình nút c) Viết thủ tục so sánh cấu trúc nhị phân tìm kiếm Câu 18

a) Hãy nêu ưu điểm khuyết điểm mà theo bạn tiêu biểu hàm cài đặt đệ qui b) Hãy nêu điểm khác biệt cấu trúc danh sách liên kết đơn so với cấu trúc mảng động Câu 19

Cho danh sách liên kết đơn chứa giá trị tăng dần

a) Hãy viết thủ tục thực thao tác lưu trữ phần tử danh sách vào bảng băm với hàm băm tự chọn b) Nêu nhận xét thao tác tìm kiếm phần tử danh sách bảng băm

Câu 20

Giả sử A mảng số nguyên có thứ tự tăng

a) Hãy viết thủ tục tạo nhị phân tìm kiếm có chiều cao thấp từ phần tử A b) Viết thủ tục duyệt nhị phân tìm kiếm để in giá trị giảm dần

Câu 21

Hãy so sánh (ngắn gọn) giống khác hai cấu trúc Cây nhị phân tìm kiếm Danh sách liên kết đơn Bạn có nhận xét thực thao tác tìm kiếm hai cấu trúc

Câu 22

Cho dãy số: 23 12 72 14 21

Hãy thêm giá trị vào bảng băm có kích thước m=7, sử dụng hàm băm H(k)= k mod 7, theo phương pháp dị tuyến tính Giải thích rõ bước thực

Câu 23

Cho mảng a gồm n phần tử kiểu Integer Ta xếp mảng a cách :

 Từ mảng a, tạo nhị phân tìm kiếm T  Duyệt T đưa nút trở lại mảng a

a) Cho biết phương pháp duyệt T để đưa giá trị nút vào mảng cho mảng tăng dần b) Cài đặt cấu trúc T (bằng C/PASCAL)

c) Xây dựng thủ tục (bằng C/PASCAL):

 Tạo nhị phân T từ mảng a

 Thủ tục duyệt để đưa phần tử trở lại mảng cho mảng tăng dần

Câu 24

Giữa cấu trúc nhị phân tìm kiếm cấu trúc mảng phần tử thứ tự tăng dần, có điểm giống khác ?

Câu 25

Cho dãy số: 35 16 42 27 10 58 24 25

a) Áp dụng thuật toán tạo nhị phân tìm kiếm để tạo từ dãy số b) Viết thủ tục duyệt để kết in dãy số giảm dần

c) Viết thủ tục tính chiều cao Câu 26

Hãy viết thủ tục/hàm tạo danh sách liên kết đơn từ nhị phân tìm kiếm cho giá trị phần tử danh sách có thứ tự tăng dần Biết gốc ROOT

Câu 27

Cho mảng chứa số nguyên

a) Viết thuật tốn tìm tần số xuất giá trị mảng b) Cho giá trị x, viết thuật tốn tìm tần số xuất x mảng

Giải câu a:

int MainArray[100]; //mảng ban đầu

int N=0; // Số phần tử mảng int SubArray[100]; //Mảng phụ

void ScanArray(); //Nhập mảng void PrintArray(); //Xuất mảng

void CheckSimilar(); //Kiểm tra phần tử trùng với void PrintSubArray(); //In mảng phụ

(6)

{

ScanArray(); PrintArray(); CheckSimilar(); PrintSubArray(); getch(); return 0; }

void ScanArray() {

printf("Nhap vao so phan tu cua mang: "); scanf("%d",&N); for(int i=0;i<N;i++)

{

printf("Nhap vao phan tu thu %d: ",i+1); scanf("%d",&MainArray[i]);

SubArray[i]=0; }

}

void ScanArray() {

printf("\n"); for(int i=0;i<N;i++) {

printf("%d ",MainArray[i]); }

}

void CheckSimilar() {

printf("\n"); for(int i=0;i<N;i++) {

int Count=0;

for(int j=i+1;j<N;j++) {

if(MainArray[i] == MainArray[j] && SubArray[i]==0) {

SubArray[j]=-1; Count++; }

}

if(SubArray[i]>-1) SubArray[i]=count+1; }

}

void PrintSubArray() {

printf("\n\n\n"); for(int i=0;i<N;i++) {

if(SubArray[i]>0)

printf("So %d xuat hien %d lan\n",MainArray[i],SubArray[i]); }

(7)

Giải câu b:

Int X=0 // X:gia tri can tim Void CheckWeight()

{

Int Count=0;

Printf(“\n Nhap vao gia tri X can tim: ”); scanf(“%d”,&X); For(int i=0;i<N;i++)

{

If(X=MainArray[i]) Count++; }

Printf(“\n Tan suat cua X: %d”, Count); }

Câu 28

Hãy so sánh hai phương pháp dùng danh sách nối kết dò tuyến tính để giải đụng độ bảng băm Cho ví dụ minh hoạ

Câu 29

Cho nhị phân T có thứ tự duyệt nút sau:

 Duyệt NLR: 40 15 30 48 44 52 55 50

 Duyệt LNR: 15 40 44 48 55 52 30 50

Hãy vẽ nhị phân T giải thích biết phương pháp duyệt ta vẽ lại nhị phân

(8)

Câu 30

a) Hãy nêu điểm khác giống cấu trúc tập tin văn tập tin nhị phân b) Hãy viết thuật toán đảo ngược thứ tự record tập tin nhị phân

Câu 31

Hãy so sánh mảng động mảng không động cấu trúc cách sử dụng Cho ví dụ minh hoạ

Câu 32

Thực thao tác sau nhị phân tìm kiếm (vẽ hình bước): a) Tạo từ số nguyên: 22, 14, 15, 28, 34, 1, 17, 27, 29, 21 b) Xố phần tử có giá trị 28

(9)

Câu 33

Sử dụng cấu trúc ngăn xếp (Stack), thực hiện:

a) Tính giá trị biểu thức hậu tố: * + - *

b) Viết thủ tục chuyển đổi số nguyên dương dạng thập phân sang dạng bát phân

c) Viết thủ tục kiểm tra chuỗi nhập vào có phải chuỗi đối xứng hay khơng (chuỗi palindrom)? a) Tính giá trị biểu thức hậu tố :

Đọc Xử li Stack

3 Đẩy vào Stack

5 Đẩy vào Stack 3,

* Lấy khỏi Stack, tính 3*5=15, đẩy 15 vào Stack 15

4 Đẩy vào Stack 15,

6 Đẩy vào Stack 15, 4,

+ Lấy khỏi Stack, tính 4+6=10, đẩy 10 vào Stack 15, 10 - Lấy 15 10 khỏi Stack, tính 15-10=5, đẩy vào Stack

2 Đẩy vào Stack 5,

* Lấy khỏi Stack, tính 5*2=10, đầy 10 vào Stack 10

Ta kết 10

Bài giải: c)

void Push(char c)

{

if(Top==Max-1)

printf("\n ngan xep day"); else Stack[++top]=c;

/* top++ ; Stack[Top]=c;*/ }

char Pop()

{

if(Top==-1)

{ printf("\n ngan xep rong"); return -1; }

else return Stack[top ]; }

int DX (char S[])

{ int i,n;n=strlen(s); for (i=0;i<n;i++)

Push(s[i]); for (i=0;i<n;i++)

if(s[i]!=Pop()) return 0; return 1; }

void main()

{ clrscr(); char s[80]; int kq=0;

printf("\n nhap vao mot chuoi: "); fflush(stdin);

gets(s); kq=DX(s); if (kq!=0)

printf("\n chuoi doi xung");

else printf("\n chuoi khong doi xung"); getch();

(10)

Câu 34

Cho dãy số định nghĩa sau

 f(n) = n = hay n =  f(n) = f(n-1) + f(n-2) n >

a) Hãy viết hàm đệ qui tính giá trị f(n), với n nhập từ bàn phím

b) Hãy viết hàm khơng đệ qui tính giá trị f(n), với n nhập từ bàn phím Sử dụng Stack để khử đệ qui c) Nêu nhận xét hai thủ tục

a) Hàm đệ qui tính giá trị f(n), với n nhập từ bàn phím int fibo(int n)

{

if(n==0 || n==1) return 1; else return fibo(n-1)+fibo(n-2); }

b) Không dùng đệ qui int fibo(int n)

{ int temp1, temp2, i=2; if(n==0 || n==1) return 1; push(stack,1);

push(stack,1); while(i<=n) {

temp1=pop(stack); temp2=pop(stack); temp1=temp1+temp2; i++;

push(stack,temp1); push(stack,temp2); }

return (pop(stack)+pop(stack)); }

Câu 35

Cho nhị phân tìm kiếm T, nút chứa số nguyên Hãy viết thủ tục cho biết: a) Có đường từ nút gốc đến nút ?

b) Có nút bậc ? c) Tại mức thứ i có nút ?

d) Cây trái phải nút gốc có cấu trúc hay khơng ? Câu 36

Cho danh sách liên kết, nút danh sách chứa điểm có toạ độ (x, y) Hãy viết thủ tục liệt kê nút có toạ độ nằm đường trịn tâm A(xA,yA) bán kính R

Câu 37

Cho hai số nguyên lớn lưu trữ hai tập tin văn bản, tập tin chứa dãy số liên tục với a) Viết thủ tục để tạo danh sách liên kết (biểu diễn số nguyên lớn) từ tập tin văn bản, nút danh sách chứa

con số

b) Viết thủ tục so sánh giá trị hai số nguyên lớn Câu 38

Hãy điểm khác biệt cấu trúc liệu động cấu trúc liệu khơng động Cho ví dụ minh hoạ

1 Trong thực tế, số đối tượng định nghĩa đệ qui, ví dụ để mô tả đối tượng "con người" cần thể thông tin tối thiểu :

? Họ tên ? Số CMND

? Thông tin cha, mẹ

Ðể biễu diễn đối tượng có nhiều thành phần thơng tin sử dụng kiểu ghi Tuy nhiên, cần lưu ý cha, mẹ người đối tượng kiểu NGƯỜI, nguyên tắc cần phải có định nghĩa sau:

(11)

char Hoten[30]; int So_CMND ; NGUOI Cha,Me; };

Nhưng với khai báo trên, ngôn ngữ lập trình gặp khó khăn việc cài đặt khơng vượt qua xác định kích thước đối tượng kiểu NGUOI.

2 Một số đối tượng liệu chu kỳ sống thay đổi cấu trúc, độ lớn, danh sách học viên lớp học tăng thêm, giảm Khi cố tình dùng cấu trúc liệu tĩnh biết mảng để biểu diễn đối tượng lập trình viên phải sử dụng thao tác phức tạp, tự nhiên khiến chương trình trở nên khó đọc, khó bảo trì khó sử dụng nhớ cách có hiệu

3 Một lý làm cho kiểu liệu tĩnh đáp ứng nhu cầu thực tế tổng kích thước vùng nhớ dành cho tất biến tĩnh 64Kb (1 Segment nhớ) Khi có nhu cầu dùng nhiều nhớ ta phải sử dụng cấu trúc liệu động

4 Cuối cùng, chất liệu tĩnh, chúng chiếm vùng nhớ dành cho chúng suốt trình hoạt động chương trình Tuy nhiên, thực tế, xảy trường hợp liệu tồn thời hay khơng thường xun q trình hoạt động chương trình Vì việc dùng CTDL tĩnh không cho phép sử dụng hiệu nhớ

Câu 39

Hãy điểm khác biệt cấu trúc tập tin nhị phân mảng biến cấu trúc Cho ví dụ minh hoạ Câu 40

Giả sử ta xét khoá từ đơn Người ta mã hoá từ theo qui tắc: kí tự mã hố thành hai chữ số thập phân ứng với thứ tự bảng chữ La tinh (từ 01 đến 26) Ví dụ khố KEY mã hố thành 11 05 25 Cho khoá TIN, HOC, LAC, HONG dựa vào mã chúng để tính địa băm với hàm băm dùng phương pháp chia, biết kích thước bảng băm m=500

Câu 41

Cho mảng A chứa dãy số: 11 15 21 22 35 42 61

a) Viết thủ tục đệ quy thực tìm kiếm giá trị X dãy số theo thuật tốn tìm nhị phân b) Viết thủ tục khơng đệ quy thực tìm kiếm giá trị X dãy số trên, sử dụng stack để khử đệ quy

Bài giải Câu a

int BinarySearch_Recursion(ItemType arr[ ], int n, ItemType key) {

if(n < 1)

return -1; int middle = n / 2; if(arr[middle] == key)

return middle; if(arr[middle] > key)

return BinarySearch_Recursion(arr, middle, key); if(arr[middle] < key)

return middle + BinarySearch_Recursion(arr + middle, n - middle, key); }

Câu b

int BinarySearch_Stack(ItemType arr[ ], int n, ItemType key) {

Stack<int> st; st.Push(n / 2); int middle; int inc = 0;

while(n > && st.Pop(middle)) {

if((arr + inc)[middle] == key) return inc + middle; else if((arr + inc)[middle] > key)

n = middle; else if((arr + inc)[middle] < key) {

(12)

}

st.Push(n / 2); }

return -1; }

Câu 42

Cho AVL

Hãy loại bỏ nút 13, 15, 10 Nêu rõ tình xảy với trường hợp cách giải quyết, minh hoạ hình vẽ

Câu 43

Cho nhị phân tìm kiếm T với cấu trúc node sau: struct Node{

int data;

Node *Left, *Right; };

typedef Node *BSNode; Hãy viết thủ tục:

a) Đếm số node có bậc

b) Tạo mảng động a (các phần tử số nguyên) có số phần tử số node T, phần tử mang giá trị giá trị node

Bài giải Câu a:

void CountNode_1(Nodeptr &Root) {

Nodeptr P; P=Root;

if(P==NULL) return 0;

else if((P->Left==NULL && P->Right!=NULL) || (P->Left!=NULL && P->Right==NULL)) return(1+CountNode_1(P->Left)+CountNode_1(P->Right))

else

return ( CountNode_1(P->Left)+CountNode_1(P->Right)) }

Câu b

Câu 44

Giả sử phải viết chương trình cho phép tra tự điển Anh Việt Hãy trình bày cách tổ chức liệu cho tự điển, cho định nghĩa kiểu liệu cần thiết

Câu 45

Cho dãy số: 42 11 22 35 61 21 15

Hãy thêm số dãy số vào nhị phân cân (cây AVL) Giải thích rõ bước vẽ hình minh hoạ

Câu 46

Một ma trận chứa phần tử với gía trị có nghĩa (phần tử khác 0) gọi ma trận thưa

a) Tìm cấu trúc liệu biểu diễn ma trận thưa cho tiết kiệm (chỉ lưu trữ phần tử có ý nghĩa) b) Viết thủ tục cho phép nhập, xuất ma trận cộng ma trận thưa

Bài giải

10 0

10 5

7

9 3

5

13 10

(13)

a) Biểu diễn CTDL lưu trữ ma trận thưa

Do ma trận thưa có nhiều phần tử=0 nên ta cần quan tâm tới phần tử !=0 Có thể dùng mảng để tổ chức lưu trữ

Struct SNode{

Int Row, Col, Value; SNode *Link; };

Struct Matrix{

Int SRow, SCol; SNode *M; };

b) Thủ tục nhập, xuất, cộng ma trận thưa void CreateMatrix(Matrix &A)

{

A.Srow=0; A.Scol=0; A.M=NULL; }

//Thủ tục nhập

void InputMatrix(Matrix &A) {

SNode *P,*Q; int temp; do{

printf("\nTong so dong cua ma tran: "); A.SRow=InputNumber();

}while(A.SRow<=0); {

printf("\nTong so cot cua ma tran: "); A.Scol=InputNumber();

} while(A.Scol<=0);

printf("\nNhap du lieu cho ma tran:\n\n"); for (int i=1;i<=A.Srow;i++)

{

printf("\t|\t");

for (int j=1;j<=A.Scol;j++) {

temp=InputNumber(); if(temp==0) printf("0\t"); else

{

P=new SNode;

P->value=temp; P->Row=i; P->Col=j;

Q=A.M;

if (Q==NULL)

{

Q->Link=A.M;

(14)

}

else

{

while(Q->Link!=NULL) Q=Q->Link;

P->Link=NULL;

Q->Link=P;

}

printf("\t"); }

} printf("|\n"); }

printf("\n"); }

//xuat du lieu cua ma tran void OutputMatrix(Matrix A) {

printf("\n");

for (int i=1;i<=A.Srow;i++)

{

printf("\t|");

for (int j=1;j<=A.Scol;j++)

{

printf("%4d",OutSnode(A,i,j));

}

printf(" |\n");

}

printf("\n"); }

//Cong ma tran

Matrix SumMatrix(Matrix A, Matrix B) {

Matrix C; CreateMatrix(C); Snode *p=A.M, *q=B.M; while (p!=NULL && q!=NULL) {

if (p->row<q->row) {

InserBottom(C,p->row,p->col,p->value); p=p->link;

} else

if (p->row==q->row) {

if (p->col<q->col) {

(15)

p=p->link; }

else

if (p->col==q->col) {

InserBottom(C,p->row,p->col,p->value+q->value); p=p->link;

q=q->link; }

else

if(p->col>q->col) {

InserBottom(C,p->row,q->col,q->value); q=q->link;

} } else

if (p->row>q->row) {

InserBottom(C,q->row,q->col,q->value); q=q->link;

} }

if (p!=NULL) while (p!=NULL) {

InserBottom(C,p->row,p->col,p->value); p=p->link;

} else

if (q!=NULL) while (q!=NULL) {

InserBottom(C,q->row,q->col,q->value); q=q->link;

}

C.Srow=A.Srow; C.Scol=A.Scol; return C; }

Câu 47

Cho biểu thức ngoặc đầy đủ: P=(((a+b)/c)-(d*e)) Sử dụng cấu trúc stack, thực hiện:

a) Viết thủ tục chuyển đổi biểu thức sang dạng biểu thức hậu tố b) Viết thủ tục tính giá trị biểu thức

(16)

a) Viết thủ tục chuyển đổi biểu thức sang dạng biểu thức hậu tố -Dùng Stack để chứa toán tử, dấu ngoặc mở

-Dùng thủ tục Push(V) để đẩy phần tử vào Stack -Hàm Pop dùng để lấy phần tử từ Stack

-Hàm Get để đọc giá trị phần tử nằm đỉnh Stack mà khơng lấy

-Độ ưu tiên dùng hàm Priority qui ước sau: Cao dấu “*” “/” với Priority 2, dấu “+” “-” với Priority 1, dấu ngoặc mở Priority

{Cài đặt thuật toán Pascal} Program ConvertInfixToRPN; Const

Opt = [‘(‘ , ’)’, ‘+’, ‘-’, ‘*’, ‘/’]; Var

T, Infix, Stack: String; {Stack dùng để chứa toán tử dấu ngoặc mở nên dùng String} P: Integer;

{ -Các thao tác Stack -} Procedure StackInit;

Begin

Stack:= ‘ ’; End;

Procedure Push (V: Char); Begin

Stack:=Stack+V; End;

Function Pop: Char; Begin

Pop := Stack[Length(Stack)]; Dec(Stack[0]);

End;

Function Get: Char; Begin

Get := Stack[Length(Stack)]; End;

{ -}

Procedure Refine (var S:String); {Hiệu chỉnh biểu thức trung tố khuôn dạng dễ đọc nhất} Var

I: integer; Begin

S:=S+ ‘ ’;

For i:=Length(S) – downto {Thêm dấu cách trước sau toán tử dấu ngoặc} If (S[i] in Opt) or (S[i+1] in Opt) then Insert (‘ ’, S, i+1);

For i:=Length(S) -1 downto {xóa dấu cách trước sau tốn tử dấu ngoặc} If (S[i]= ‘ ’ ) or (S[i+1] = ‘ ’ ) then Delete (S,i+1, 1);

End;

Function Priority(Ch: Char):Integer {Hàm lấy mức độ ưu tiên} Begin

Case ch of

‘ * ’, ‘ / ’ : Priority:=2; ‘ + ’, ’ - ‘ :Priority:=1; ‘( ‘ : Priority :=0; End;

End;

Procedure Process (T: String); {Xử lí phần tử đọc từ biểu thức trung tố} Var

C,X :Char; Begin

C:=T[1];

If not (C in Opt) then Write(T, ‘ ’) Else

Case C if

‘ ( ’ : Push (C) ; ‘ ) ’ : Repeat

X:=Pop;

If X<> ‘ ( ’ then Write (X, ‘ ’); Until X= ‘ ( ’;

‘ + ’, ‘ - ’, ‘ * ’, ‘ / ’: Begin

(17)

Write (Pop, ‘ ’); Push (C);

End; End;

Begin

Write (‘Infix = ’); Readln(Infix); Refine(Infix);

Writeln (‘Refined: ’, Infix); Write (‘RPN: ’);

T := ‘ ’;

For p:=1 to Length (Infix)

If Infix[p] <> ‘ ’ then T:=T+Infix[p] Else

Begin

Process (T); T := ‘ ’; End;

While Stack <> ‘ ’ Write (Pop, ‘ ’); Writeln ;

End

b) Viết thủ tục tính giá trị biểu thức Program CalculateRPNExpression; Const

Opt = [‘+’, ‘-’, ‘*’, ‘/’]; Var

T, RPN : String;

Stack: Array[1 255] of Extended; P, Last : Integer;

{ -Các thao tác Stack -} Procedure StackInit;

Begin Last :=0; End;

Procedure Push (V : Extended); Begin

Inc(Last); Stack [Last]:=V; End;

Function Pop: Extended; Begin

Pop:=Stack[Last]; Dec(Last); End;

{ -}

Procedure Refine (var S:String); {Hiệu chỉnh biểu thức trung tố khuôn dạng dễ đọc nhất} Var

I: integer; Begin

S:=S+ ‘ ’;

For i:=Length(S) – downto {Thêm dấu cách trước sau toán tử dấu ngoặc} If (S[i] in Opt) or (S[i+1] in Opt) then Insert (‘ ’, S, i+1);

For i:=Length(S) -1 downto {xóa dấu cách trước sau toán tử dấu ngoặc} If (S[i]= ‘ ’ ) or (S[i+1] = ‘ ’ ) then Delete (S,i+1, 1);

End;

Procedure Process (T: String); {Xử lí phần tử T đọc từ biểu thức RPN} Var

X, Y :Extended; E: Integer; Begin

If not (T[1] in Opt ) then {T toán hạng} Begin

Val(T,X,E) ; Push(X); {Đổi T thành số đẩy giá trị vào Stack} End;

Else {T tốn hạng}

Begin

Y:= Pop; X:=Pop; {Ra hai} Case T[1] of

‘+’ : X :=X+Y; ‘-’ : X :=X-Y; ‘*’ : X :=X*Y; ‘/’ : X :=X/Y; End;

Push(X); {Vào một}

(18)

Begin

Write (‘Enter RPN Expression: ’); Readln(RPN); Refine(RPN);

StackInit; T:= ‘ ’;

For p:=1 to Length(RPN) {Xét kí tự biểu thức RPN từ trái sang phải} If RPN[p] <> ‘ ’ then T:=T+RPN[p] {Nếu dấu cách nối vào xâu T}

Else {Nếu gặp dấu cách}

Begin

Process(T); {Xử lí phần vừa đọc xong}

T:= ‘ ’; {Đặt lại T để chuẩn bị đọc phần tử mới} End;

Writeln(RPN, ‘ = ’, Pop:0:4) {In giá trị biểu thức RPN lưu trog Stack} End

Câu 48

Cho mảng A chứa dãy số: 11 15 21 22 35 42 61

c) Viết thủ tục đệ quy thực tìm kiếm giá trị X dãy số theo thuật tốn tìm nhị phân d) Viết thủ tục khơng đệ quy thực tìm kiếm giá trị X dãy số trên, sử dụng stack để khử đệ quy

Giống câu 41

Câu 49

Cho khoá : , , 27 , 125 , 216 , 343

Giả sử bảng có kích thước m=7, hàm băm h(k)= k mod

Hãy dùng hình vẽ minh hoạ tình trạng bảng băm sau khoá đưa vào nói rõ cách giải đụng độ địa phương pháp dị tuyến tính

Câu 50

Cho AVL

a) Lần lượt thêm vào khoá 7, 2, 1, 3, Hãy nêu rõ tình xảy ứng với trường hợp cách giải Minh họa hình vẽ

b) Hãy nêu tình xảy cách giải xoá phần tử

Đã giải(Xem tài liệu viết tay)

4

Ngày đăng: 30/05/2021, 13:42

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w