Dùng stack đổi cơ số từ hệ 10 ra hệ 2

#include<stdio.h>
#include<conio.h>
#include"stdlib.h"
struct node
{
    int info;
    struct node *next;

};
typedef struct node *Stacknode;
Stacknode S;
void StackLint(Stacknode *S)
{
    *S=NULL;
    return;

} // khai bao stack = dslk
int StackEmpty(Stacknode S)
{
    return (S==NULL);

} // kiem tra stack rong
void StackPush(Stacknode *S,int x)
{
    Stacknode p;
    p=(Stacknode)malloc(sizeof(struct node));
    p->info=x;
    p->next=*S;
    *S=p;
} // day 1 phan tu vao stack


void StackPop(Stacknode *S,int *x)
{
    Stacknode p;
    if(S!=NULL)
    {
        *x=(*S)->info;
        p=*S;
        *S=(*S)->next;
        free(p);

    }

} // lay 1 phan tu khoi stack

void doi_10_2(Stacknode *S, int *n)
{
    int du, thuong,x;
    Stacklint(S);
    printf("Nhap so he 10: ");
    scanf("%d",n);
    thuong=*n;
    while(thuong!=0)
    {
        du=thuong%2;
        thuong=thuong/2;
        push(S,Newnode(du));
    }
    printf("he 2 cua so %d la: ", *n);
    while(!StackEmpty(S))
        printf("%d",pop(S,&x));

}
int main()
{


int i,x;
StackLint(&S);
for(i=0;i<10;i++)
    StackPush(&S,i);
while(S!=NULL)
{
    StackPop(&S,&x);
    printf(" %d ",x);

}
int n;
    doi_10_2(&S,&n);

return;
}

Đây là đoạn code về chuyển đổi cơ số từ hệ 10 ra hệ 2 bằng stack! ở trong phần void doi-so 10 2 không biết em bị lỗi gì! Ai giúp em sửa đoạn này với ạ! em cảm ơn!

Lâm, Code này bị thiếu tùm lum hàm mà. Làm sao mà chạy được?

1 Like

Anh sửa giúp em được không ạ! đổi từ hệ 10 ra hệ 2

đoạn voide void doi_10_2 đó ạ! vẫn thiếu ở dưới hàm main nhưng em không khắc phục được

1 Like

mình khuyên này … hiểu dc cách hình thành cấu trúc thôi … :v … sau đó chuyển sang C ++ mà học mà làm có sẵn các thư viện rồi thích stack thì có stack thích queue thì có queue … còn mình ngại đọc code lắm … :slight_smile:

1 Like

Mình khuyên Lâm nhé, tự code đi, đừng copy code ở đẩu đâu trên mạng đem về coi là của mình. Như vậy không học được đâu. Code đó 100% không phải do bạn viết, bạn chỉ copy ở đâu đó về. Mà còn không biết cách copy dẫn đến thiếu hàm mà bạn cũng không hiểu thiếu cái gì. Vấn đề không phải là bài này lỗi, vấn đề là bạn không biết bạn đang hỏi cái gì.

Hãy bắt đầu lại từ đầu, chậm mà chắc. Tin Đạt đi, nếu coi lại kiến thức cho vững, thay vì dành thời gian tìm bài có sẵn. Thì tầm 1 tháng thôi là bạn đã nắm kiến thức rồi.

4 Likes

em hỏi về phần đổi cơ số ạ! vì code đoạn đó em tìm trên mạng r đề vào bài này! còn cả về stack là của em ạ!

1 Like

Đề bài là dùng stack để đổi từ hệ 10 sang hệ 2 hay sao?

Em copy đoạn code trên mạng bị thiếu rồi, hoặc là em làm mới. Hoặc là em tìm code khác trên mạng (mà em tìm không có tìm thấy cái em cần đâu).

Hôm trước anh bực mình là vì a đọc xong thấy code copy thiếu tùm lum mà đem đi hỏi, khác nào đánh đố mọi người. Nhưng nếu em nêu rõ vấn đề, anh sẽ giúp, và phải là code của em. Thì khi đó anh sửa em mới hiểu, và ít ra anh hiểu em đang hỏi cái gì.

Em đọc bài này, bạn này cũng gặp tình trạng tương tự của em.

3 Likes

Bạn @phamhalam trình bày thuật toán của bạn đi. Ý tưởng của bạn như nào? Bạn thực hiện từng bước như nào? Sau khi thuật toán được phân tích đúng, chúng ta sẽ cùng nhau hiện thực từng bước. Làm như vậy sẽ dễ dàng hơn nhiều.

dạ vâng! đề bài là dùng như thế! vấn đề em cũng không tìm ra nên đã chèn thử vào nên mới lỗi be bét z anh ạ! mong anh thông cảm phần này không biết hỏi đi đâu nên mới lên đây hỏi ạ!

2 Likes

Ok, để tối về có thời gian anh xem cho :smile:

1 Like

Vâng! Em cảm ơn anh làm phiền mọi người quá!

1 Like

có nhất thiết phải dùng danh sách liên kết k bạn? bài này dùng mảng 1 chiều có vẻ đơn giản hơn.
Nếu dùng mảng 1 chiều, bạn có thể tham khảo bài này.


struct myStack
{
	int a[100];
	int n;
};
typedef struct myStack MYSTACK;

void InitStack(MYSTACK &stack);
void Push(MYSTACK &stack,int values);
int Pop(MYSTACK &stack);
void PrintStack (MYSTACK stack);

int _tmain(int argc, _TCHAR* argv[])
{
	int number;
	MYSTACK stack;
	InitStack(stack);
	std::cout<<"Nhap n :"<<std::endl ;
	std::cin>>number;
	while (number>0)
	{
		int sodu=number%2;
		Push(stack,sodu);
		number=number/2;

	}
	std::cout<< "So nhi phan cua n: " <<std::endl;
	while(stack.n >0)
	{
		int temp=Pop(stack);
		std::cout << temp;
		stack.n--;
	}
	
	std::cout<<std::endl;

	return 0;
}

void Push(MYSTACK &stack,int values)
{
	
	stack.a[stack.n]=values;
	
	stack.n++;
}

int Pop(MYSTACK &stack)
{
	return stack.a[stack.n-1];
}

void InitStack(MYSTACK &stack)
{
	stack.n=0;
}

2 Likes


tranh thủ qua đây đàm đạo bài này cho vui mọi người

2 Likes

Chưa đọc code của Tuấn nhưng ý của Tuấn đúng rồi đấy. Stack chỉ là khái niệm, có thể dùng mảng 1 chiều để thể hiện stack. Dùng DSLK phức tạp hơn không cần thiết.

2 Likes

bài này dùng mảng đúng là hay hơn thật! em chèn dslk bất thành xin phép tham khảo bài!

2 Likes

cảm ơn bác khai sáng cho mình

2 Likes

mình cũng mới học C++, đây là code của mình mong mọi người góp ý

#include <iostream>
using namespace std;

//khai bao cau truc stack
#define max 100
int a[max];
int sp;

//tao stack rong
void init(int a[], int &sp)
{
    sp=-1;
}

//xet stack rong
int isEmpty(int a[], int sp)
{
    if(sp==-1)
        return 1;
    else
        return 0; //tai sao khong dung else
}

//xet stack day
int isFull(int a[], int sp)
{
    if(sp==max-1)
        return 1;
    else
        return 0;
}

//them phan tu vao stack
int push(int a[], int &sp, int x)
{
    if(sp != max-1)
    {
        a[++sp] = x;
        return 1;
    }
    else
        return 0;
}

//lay/xoa phan tu stack
int pop(int a[], int &sp, int &x)
{
    if (sp!=-1)
    {
        x=a[sp--];
        return 1;
    }
    else
        return 0;
}

//chuyen he 10 sang he 2
void convertDectoBin(int d)
{
    int du;
    while(d!=0)
    {
        du = d%2;
        push(a, sp, du);
        d = d/2;
    }
}

//in ra he 2
void printBin()
{
    int x;
    while(sp!=-1)
    {
        pop(a, sp, x);
        cout<<x;
    }
}

int menu()
{
    int chon;
    cout<<"***************************\n"<<"1.khoi tao stack\n"<<"2.xet rong\n"<<"3.xet day\n"<<"4.them stack\n"<<"5.xoa stack\n"<<"6.chuyen he 10 sang he 2\n"<<"0.thoat\n"<<"+++++++++++++++++++++++\n"<<"chon: ";
    cin>>chon;
    return chon;
}

int main()
{
    int x, chon;
    do
    {
        chon=menu();
        switch(chon)
        {
        case 1:
            init(a, sp);
            cout<<"da khoi tao stack\n";
            break;
        case 2:
            int k;
            k = isEmpty(a, sp);
            if(k==1)
                cout<<"danh sach rong\n";
            else
                cout<<"danh sach khong rong\n";
            break;
        case 3:
            int m;
            m = isFull(a, sp);
            if(m==1)
                cout<<"danh sach day\n";
            else
                cout<<"danh sach chua day\n";
            break;
        case 4:
            cout<<"nhap gia tri can them: ";
            cin>>x;
            int n;
            n= push(a, sp, x);
            if(n==1)
                cout<<"them thanh cong\n";
            else
                cout<<"them khong thanh cong\n";
            break;
        case 5:
            int p;
            p= pop(a, sp, x);
            if (p==1)
                cout<<"xoa thanh cong\n";
            else
                cout<<"xoa khong thanh cong\n";
            break;
        case 6:
            int d;
            cout<<"nhap so he 10: ";
            cin>>d;
            convertDectoBin(d);
            cout<<"he 2: ";
            printBin();
            cout<<endl;
            break;
        }
    }
    while (chon!=0);

}
1 Like

@tuancoi2506 anh có thể cho em xem code C để xem ý tưởng được không ạ. em chưa biết C++ nên k hiểu

Từ code suy ngược ra ý thì nhức đầu lắm.

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