當前位置:首頁 » 編程語言 » 求c語言中順序棧的長度
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

求c語言中順序棧的長度

發布時間: 2023-04-24 21:03:02

『壹』 用c語言編寫函數實現順序棧的進棧、退棧、取棧頂的演算法。

#include<stdio.h>
#define stacksize 100 //假定預分配的棧空間最多為100 個元素
typedef char elementtype; //假定棧元素的數據類型為字元 ,在此處可以自行設置
typedef struct
{
elementtype data[stacksize];
int top;
}seqstack;
// 置空棧
void initstack(seqstack *s)
{
s->top=-1;
//解釋一下,s->top 指向的是當前棧頂元素的位置
//當要向棧中添加一個新元素時,要先將s->top增加1,
//此時s->top 指向的就是新元素要添加的位置了。
//所以當棧為空時,填加第一元素時,top加1 後
//s->top的值就變為0,也就是第一個元素的位置了。
}
//判棧空
int stackempty(seqstack *s)
{
if(s->top==-1)
return 1; //若相等就返回1,否則為0
else return 0;
}
//入棧
void push(seqstack *s,elementtype x)
{
if(s->top==stacksize -1 ) //進棧前判斷棧是否已經滿了
printf(" stack overflow\n");
else
{
s->top= s->top + 1;
s->data[s->top]=x;
}
}
//出棧
elementtype pop(seqstack *s)
{
if(stackempty(s)) //出棧前先判斷當前棧中是否有內容
printf("stack is empty\n");
else
{
return s->data[s->top--]; //出棧後s->top的值會自減1
}
}
//取棧頂元素(只是想知道棧頂的值,並沒有出棧)
elementtype gettop(seqstack *s)
{
if(stackempty(s))
{
printf("stack already empty.\n");
}
else return s->data[s->top];
}
int main()
{
elementtype x;
seqstack *s; //定義一個棧,用指針的方式定義的
initstack(s); //想初始化定義好的棧
//當棧為空時調用出棧操作
pop(s);

//向棧中添加一個元素a
push(s,'a');

//觀察此時的棧頂元素
x=gettop(s);
printf("%c\n",x);

//再添加一個元素b
push(s,'b');

//觀察此時的棧頂元素
x=gettop(s);
printf("%c\n",x);

//彈出棧頂的元素
x=pop(s);
printf("%c\n",x);

//觀察彈出後棧頂元素的變化情況
x=gettop(s);
printf("%c\n",x);
return 0;
}

『貳』 用c語言描述順序存儲結構的線性表求表長的演算法

#include<stdio.h>
#include<stdlib.h>
#define list_init_size 5
#define listincrement 10
#define overflow -2
typedef int status;
typedef int elemtype;
typedef struct
{
elemtype *elem;
int length;
int listsize;
} sqlist;
status initlist_sq(sqlist &L)
{
L.elem=(elemtype *)malloc(list_init_size * sizeof(elemtype));
if(!L.elem) exit(overflow);
L.length=0;
L.listsize=list_init_size;
return 1;
}

將順序表初始化為5個元素,在結構中定義了順序表的長度,int length:所以在主函數中可以直接調用用printf("%d",L.length)就得到了當前的長度,無論是刪除,添加,L.length都會隨著改變,比如我們建一個添加的函數

status listinsert_sq(sqlist &L, int i ,elemtype e)
{
int * q , *p ,* newbase;
if(i<1 || i>L.length + 1) return 0;
if(L.length >= L.listsize)
{
newbase=(elemtype *)realloc(L.elem,(L.listsize+listincrement) * sizeof(elemtype));
if(!newbase) exit (overflow);
L.elem=newbase;
L.listsize+=listincrement;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]) ;p>=q ;--p)
*(p+1) = *p;
*q = e;
++L.length;
return 1;
}
如果加一個元素,就會把L.length自動加1,這樣避免了再寫函數求表長

『叄』 C++: 編寫一個順序棧,要有順序棧的類型判空操作,清空操作與求棧長操作,入棧操作,出棧操作。

#include<iostream>
#include<malloc.h>

usingnamespacestd;

#defineSTACK_INIT_SIZE100
#defineSTACK_SPACE_INCR20
#defineTRUE1
#defineFALSE0

typedefintSElemType;
typedefintStatus;

structSqStack
{
SElemType*base;
inttop;
intstackSize;
};

StatusInitStack(SqStack&S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
{
returnFALSE;
}
S.top=0;
S.stackSize=STACK_INIT_SIZE;
returnTRUE;
}

StatusStackIsEmpty(SqStackS)
{
if(!S.top)
returnTRUE;
else
returnFALSE;
}

voidClearStack(SqStack&S)
{
if(S.base)
free(S.base);
S.top=0;
S.stackSize=0;
}

intStackLength(SqStackS)
{
returnS.top;
}

voidPrintStack(SqStackS)
{
inti;
cout<<"棧長度為"<<StackLength(S)<<",棧中數據如下:"<<endl;
for(i=0;i<S.top;i++)
{
cout<<S.base[i]<<"";
}
cout<<endl;
}

StatusPush(SqStack&S,SElemTypee)
{
if(S.top==S.stackSize)
{
//棧空間已滿,重新獲取空間
S.base=(SElemType*)realloc(S.base,(S.stackSize+STACK_SPACE_INCR)*sizeof(SElemType));
if(!S.base)
衫亮拍{
returnFALSE;
}
S.stackSize+=STACK_SPACE_INCR;
}
S.base[S.top]=e;
S.top++;
returnTRUE;
}

StatusPop(SqStack&S,SElemType&e)
{
if(TRUE==StackIsEmpty(S))
{
returnFALSE;
}
S.top--;
e=S.base[S.top];
returnTRUE;
}

StatusInitStackInput(SqStack&S)
{
SElemTypen;
cout<<"請輸入數據,以-1結束:"<<endl;
while(1)
{
cin>>n;
if(n==-1)
break;
Push(S,n);
}
returnTRUE;
}

intmain()
{
intm;
SElemTypee;
SqStacks;
InitStack(s);
或羨do
{
cout<<endl;
cout<<"所有操作如下:"<<endl;
cout<<"1.採用順序存儲實現棧的初始化操作"<<endl;
cout<<"2.採用順序存儲實現棧的入棧操作"<<endl;
cout<<"3.採用順序存儲實現棧的出棧操作"<<endl;
cout<<"4.列印棧中所有數據"<<endl;
cout<<"-1.退出"<<endl;
cout<<"請選擇:"<<endl;
cin>>m;

switch(m)
{
case1:
InitStackInput(s);
break;
case2:
cout<<"輸入入棧的數據:"<<endl;
cin>>e;
Push(s,e);
break;
case3:
if(TRUE==Pop(s,e))
cout<<"出棧的數據為:"<<e<<endl;
鍵純else
cout<<"出棧失敗"<<endl;
break;
case4:
PrintStack(s);
break;
case-1:
break;
default:
cout<<"沒有該選項!"<<endl;
break;
}
}while(m!=-1);

ClearStack(s);
return0;
}

g++編譯通過, 編寫了main函數以測試出入棧的功能, 運行結果正確

望採納, 謝謝~

『肆』 數據結構中計算棧的長度的函數看不懂

是順序棧和衫吧?你這個棧的結構體定義應該貼出來。
s[0 ]
s[1 ]
s[2 ]
s[3 ]

比如p首先指喚賣腔向是s[0],p=s.top。
然後p開始往下挪動,一直到p等於s.base為止。

p++不是往上的,是往下的.....比如在數組里&a[0]=p;p++;之後p就指向a[1]了。
棧頂在上,棧底在下,s.base應該相當於我的配埋s[3]位置。

『伍』 C語言怎麼求順序棧長度

這是昌賣帶指針相減的特性,指針相減就是兩個之耐蘆間的元素個數。
(unsigned int)S->top - (配雀unsigned int)S->base; // 要得到實際的地址值相減強制轉換成整數就行了

『陸』 c語言順序棧問題

for(i = s->top; i>=0; i--) { //遍歷棧
printf("%d->",s->data);
}
這里data你定義的是數組名所以
printf("%d->",s->data[i]);
求判並老採納,蔽賀求經驗,求懸掘升賞

『柒』 給定元素入棧順序和出棧順序,編寫計算棧最短長度的代碼.例如:入棧序列1 2 3 4,出棧序列2 3 1 4

push 1--1
push 2--2
pop 2--1
push 3--2
pop 3--1
pop 1--0
push 4--1
pop 4--0

此時棧的答燃最短長度(上面右扒舉慧邊數字最大者)春答為 2

『捌』 急求c語言關於堆棧的長度

找本數據結構書,都是最簡單的常式代碼,真的懶得敲一遍了

『玖』 c語言 棧的操作

#include
#include

#define Max 100

typedef char T;

typedef struct MyStack
{
T aa[Max];
unsigned int p;

} stack;

//創建空棧
stack* createEmptyStack()
{
stack* st = (stack *)malloc(sizeof(stack));
int i=0;
for(i=0;i<Max;i++)
st->aa[i]=0;
st->p=0;
return st;
};

//棧判空
int isEmpty(const stack* st)
{
if(st->p==0) return 1;
else return 0;
};

//求棧的大小
unsigned int size(const stack* st)
{
return st->p;
};

//push操作
void push(stack* st,const T a)
{
st->p=st->p+1;
if(st->p==Max)
{
printf("棧滿\n");
st->p--;
return;
}
st->aa[st->p]=a;
};

//pop操作
T pop(stack* st)
{
if(isEmpty(st))
{
printf("棧空");
return NULL;
}
char t=st->aa[st->p];
st->p=st->p-1;
printf("%c ",t);
return t;
};

//棧銷毀
void destroy(stack* st)
{
free(st);
};

int main()
{

stack* st = createEmptyStack();
if(isEmpty(st)) printf("MyStack is empty\n");
else printf("MyStack is not empty\n");
push(st,'a');
push(st,'b');
push(st,'c');
push(st,'d');
push(st,'e');
printf("%d\n",size(st));
while(!isEmpty(st)) pop(st);
destroy(st);
system("pause");
return 0;
}

『拾』 c語言數據結構高手請進,關於順序棧的基本操作問題。

1. 想通過調用函數改變某個變數的值,必須傳遞這個變數的地址。也就是在InitStack中申請的內存並沒有賦給Main中的s變數,會導致後面的訪問出錯。改為引用就可以了:
void InitStack(SqStack* &s)//初始化棧
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}

2.在"Pop(s,e);", 這個e並沒有內存,導致"*e=s->data[s->top];"出錯。
需要給它申請內存:
ElemType *e = (ElemType*)malloc(sizeof(ElemType));
最後"free(e);"一下。