الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال عن stack

مغلق
بدأه Amjad.IT في 25 نوفمبر 2006 · 7 رد · 850 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قمت بعمل برنامج يطبق مبدأ stack وأعتقد أنكم تعرفون ما هو stack.

قمت بكتابة الكود التالي:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 5

typedef struct stack {
	int ele[MAX];
	int top;
}stack;

void create_empty_stack(stack *s) {
	s->top=-1;
}
int isfull (stack *s) {
	if (s->top==MAX-1) return 1; else return 0;
}
int isempty (stack *s) {
	if (s->top==-1) return 1; else return 0;
}
void push (stack *s, int item) {
	if (isfull) {
		printf ("\nFull!");return;
	}
	s->top++;
	s->ele[s->top]=item;
}
int pop (stack *s) {
	if (isempty) {
		printf ("\nEmpty!");return -1;
	}
	return (s->ele[s->top--]);
}
void trav (stack *s) {
	int i;
	for (i=0;i<=s->top;i++)
		printf ("%d\n",s->ele);
}
int peek (stack *s) {
	if (isempty (s)) printf ("\nEmpty!");
	return s->top;
}
void main () {
	stack *s;
	s=(stack *)malloc(sizeof(stack));
	int p;
	int item, choice;
	create_empty_stack (s);
	while (1) {
		clrscr();
		printf ("1. Push\n"
				"2. Pop\n"
				"3. Trav\n"
				"4. Peek\n"
				"5. exit\n"
				"\n Enter your choice: ");
		scanf ("%d",&choice);
		switch (choice) {
			case 1:
				printf ("\nEnter a number");
				scanf  ("%d",&item);
				push (s,item);
				break;
			case 2:
				printf ("%d", pop(s)); getch();break;
			case 3: trav(s);getch();break;
			case 4: printf("\n%d", peek(s));getch();break;
			case 5: exit (1);
		}
	}
}

ولكنه لا يعمل، حيث أنه لا يضيف أي عناصر للقائمة، ولا أعرف ما هو السبب.

أرجو المساعدة فوراً ولكم جزيل الشكر

ملاحظة: هذا كود سي، ولكنني قمت بكتابته على كمبايلر سي++. وما أريده كود سي.

#2

هناك مشكلة في الكود الذي كتبته وهي في التابعين push و pop وهي أنك تفحص عنوان التابع isfull أو isempty بدلا من استدعائه وفيما يلي التصحيح:

void push (stack *s, int item) {
	if (isfull(s)) {
		printf ("\nFull!");return;
	}
	s->top++;
	s->ele[s->top]=item;
}
int pop (stack *s) {
	if (isempty(s)) {
		printf ("\nEmpty!");return -1;
	}
	return (s->ele[s->top--]);
}
#3

أشكرك جزيل الشكر، وبارك الله فيك

عندي استفسار

في main قمت بحذف s=(stack*)malloc... وبقي البرنامج يعمل بشكل صحيح، مع أننا في هذه الحالة لم نقم بحجز شيء في الذاكرة سوى مؤشر. فما تفسير ذلك؟ أرجو أن يكون سؤالي واضحاً :)

#4

أرى أنك لست في حاجة لاستخدام malloc بما أن حجم stack معروف مسبقا

sizeof(stack)=sizeof(ele)+sizeof(top)=5*sizeof(int)+sizeof(int)=6*sizeof(int)

إذا أردت استخدام التحكم بالذاكرة غير تعريف stack كالتالي

typedef struct stack {
int* ele;
int top;
}stack;

عندها غير التابع create_empty_stack إلى التالي

void create_empty_stack(stack* s, int max){
s->ele=(int*)malloc(max);
s->top=-1;
}

باستعمال هذه الطريقة ستكون مظطرا لإعادة صياغة البرنامج :(

أخيرا لا تنسى استعمال free قبل خروجك من البرنامج

free(s->ele);
free(s);
#5

شكرا على تعاونكم

استفساري هو كالتالي:

هذا جزء من البرنامج:

typedef struct stack {
	int ele[MAX];
	int top;
}stack;

.
.
.
void main () {
	stack *s;

	create_empty_stack (s);
	while (1) {

   .
   .
   .
}

في main قمنا بحجز مؤشر اسمه s حجمه 2 بايت ، ولم نقم بحجز struct.

أي أنه أين يخزن البيانات؟؟

أم أنني مخطئ والكمبايلر يقوم بحجز struct ومؤشر يشير الى ذلك struct !!!

تم تعديل هذه المشاركة بواسطة abc_amjad في 26 نوفمبر 2006 في 18:14

#6

أنا جربتها و الكومبايلر طلع run-time error الكومبايلر بتاعى VS2005

#7

يقوم الكمبايلر بحجز struct ومؤشر يشير الى ذلك struct

listab5.gif

تم تعديل هذه المشاركة بواسطة TigerZ!D في 27 نوفمبر 2006 في 03:59

#8

شكراً لكم على التوضيح

وبارك الله فيكم

هذا الموضوع مغلق.

مواضيع مشابهة