Citat:
Ursprungligen postat av
Enterprise
Det går ju att använda en array för att göra en stack-struktur.
Dock blir den begränsad till förutbestämd storlek, vilket ofta talar för en länkad lista.
[php]// C program for array implementation of stack
#include
#include
#include
// A structure to represent a stack
struct Stack {
int top;
unsigned capacity;
int* array;
};
// function to create a stack of given capacity. It initializes size of
// stack as 0
struct Stack* createStack(unsigned capacity)
{
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->capacity = capacity;
stack->top = -1;
stack->array = (int*)malloc(stack->capacity * sizeof(int));
return stack;
}
// Stack is full when top is equal to the last index
int isFull(struct Stack* stack)
{
return stack->top == stack->capacity - 1;
}
// Stack is empty when top is equal to -1
int isEmpty(struct Stack* stack)
{
return stack->top == -1;
}
// Function to add an item to stack. It increases top by 1
void push(struct Stack* stack, int item)
{
if (isFull(stack))
return;
stack->array[++stack->top] = item;
printf("%d pushed to stack\n", item);
}
// Function to remove an item from stack. It decreases top by 1
int pop(struct Stack* stack)
{
if (isEmpty(stack))
return INT_MIN;
return stack->array[stack->top--];
}
// Function to return the top from stack without removing it
int peek(struct Stack* stack)
{
if (isEmpty(stack))
return INT_MIN;
return stack->array[stack->top];
}
// Driver program to test above functions
int main()
{
struct Stack* stack = createStack(100);
push(stack, 10);
push(stack, 20);
push(stack, 30);
printf("%d popped from stack\n", pop(stack));
return 0;
}[/php]
Haha, se på fan och hans moster ! Den var ta mig tusan ett bra exempel.
Där ser man, allt är inte helt förlorat.
Det finns hopp om mänskligheten ännu.
Ja, kreativiteten alltså, men mänsklighetens dumhet lär bestå ändå
Hittade du den som ett exempel, eller var det något som du svängde
ihop medans jag knäppte en öl i bastun ?
Jag har dock synpunkter på att
peek bör skrivas så här:
[php]
int *peek(struct Stack* stack)
{
static int temp = 0; /* Temporär kopia på stackens top medlem. */
if (isEmpty(stack))
return NULL;
temp = stack->array[stack->top];
return (int *) &temp;
}
[/php]
Koden garanterar att användaren inte kan korrumpera stackens innehåll,
genom att bara lämna ut en kopia på toppmedlemmen.
Det gör i och för sig returvärdet i den andra peek också.
Annars kan användaren lockas till att med peek() förändra värdet i stackens
objektmedllemmar. Och så brukar man inte vilja att stackar ska hanteras.
Det blir så att säga en osynlig korruption av data.
Haha, det var minsann ett bra förslag. Kudos och credd för det
Mycket möjligt att de program som tilldelas ett fast stackutrymme, av kompilatorn och länkaren
faktiskt också är byggt på liknande kod.
Den vanliga programmeraren ser ju inte koden som hanterar stacken precis.
Det anses nämligen att det är dålig programmeringssed att bygga program som
bygger på väldigt djup rekursion, och så dåligt designade bör inte program vara.
För djup rekursion är den vanligaste orsaken till att stacken blir full, och programmet avslutas med en exception.
Därav programmeringsforumet stackoverflows namn.
Nu har jag ju inte provkört koden, kollade bara lite snabbt igenom den.
Men mycket intressant ändå.
Stackoverflow error var den ihärdiga 16-bits programmerarens mardröm
för det kunde bli knepigt att ta reda på var det gick snett.
Man fick vanligen inte plats med debugger också i det lilla utrymme som fanns
Och på den tiden var det vanligt med stackoverflow.
16-bits DOS och Windows miljö hade ju bara 64K segment, och det hände att
det segmentet som höll stacken blev fullt.
Då vart det ofta förkylt, och krångligt att ta reda på var det ballade ur.
Sedan så kom ju memory model large som man kunde tilldela tex
överlappande 2 segment,
men det var väl få program som trots det ballade ur.
Man tänkte på ett annat sätt då.
I 32-bit och 64-bits OS händer det nästan aldrig numera.
De som skriver program är vanligen vakna på den detaljen.
Men det finns säkert klantskallar idag också

Lätt att missa dock.
Windows och Microsoft fick oförtjänt dåligt rykte i början eftersom de var tvungna
att skohorna in ett krävande OS i en sådan ytterst trång miljö som 16-bit var.
Det var också speciella svårigheter med att skriva program för Windows/DOS.
Sedan så kom ju 32-bits miljön och då försvann många av de problemen.
En speciell grej som gav kunskap och erfarenhet maskinmässigt
med 16-bit var att man i real mode kunda anropa hårdvaran direkt.
Men när 32-bit Windows kom så fick man helst gå via Windows API.
Inte så lätt att lära sig utan exempel.
Det blev mycket förvirring hos utvecklarna med tex Overlapped ops, och tex DDE.
En mycket irriterande situation kunde uppstå genom att den begärda Overlapped
operationen aldrig slutfördes. Och man visste inte varför, typ
Programspråket Swift (Apple) verkar vilja gå tillbaks ett steg med sitt API,
och programspråk.
att funktionerna påstås bara ta ett argument, ett message,
som sedan funktionen får parsa meddelandet som den bäst vill.
Men då har man inte kompilatorn till hjälp alls att varna för fel parametrar.
Windows grundläggande fönsterhantering (tex flytta, förstora, förminska)
sker just genom att parsa WM_MESSAGES.
Skaparen av Linux, Linus Torvalds, han var nog lite lat för han gav sig på
32-bit miljön direkt.
I stort håller jag med Linus om att ett OS inte behöver skrivasobjektorienterat.
Skriver man ett OS som Linux är så kan man inte slösa CPU-cykler
bara på att anropa medlemsfunktioner för alla objekt i all oändlighet.
Alla anrop kostar nämligen cykler.
Måste ha varit ett jäkla trixande och joxande för Linus,
med tanke på att man på den tiden
hade floppys och han hade inte ens en FAT-hanterare från början.
Och inte ens att Internet fanns, måste ha kostat mycket med bara
modem-uppkopplingen, och teleavgifterna.
Läste nyss att Windows 11 presterar dåligt på vissa AMD-kärror,eftersom man kompilerat Win 11 med att inte ta hänsyn till att en del av dessa CPUer
har en större cache.
Tittar kanske imorgon mera på koden om inte några andra har
några förslag ?
Nu är det nanna kudden som gäller, typ...