棧c語言
㈠ c語言中,什麼是棧,什麼是堆
1、棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數等值。局部變數,任務線程函數之類的是放在(使用)棧裡面的,棧利用率高一些。其操作方式類似於數據結構中的棧。特別,棧是屬於線程的,每一個線程會有一個自己的棧。
2、堆區(heap):一般由程序員分配釋放,若程序員不釋放,則可能會引起內存泄漏。注意它和數據結構中的堆是兩回事,分配方式倒是類似於鏈表,常見的就是malloc出來的都是屬於堆區,就像固定出來的區域,到free的時候才釋放,有點類似全局的,靜態的。
(1)棧c語言擴展閱讀
棧內存是由編譯器自動分配與釋放的,它有兩種分配方式:靜態分配和動態分配。
1、靜態分配是由編譯器自動完成的,如局部變數的分配(即在一個函數中聲明一個int類型的變數i時,編譯器就會自動開辟一塊內存以存放變數i)。
2、動態分配由alloca函數進行分配,但是棧的動態分配與堆是不同的,它的動態分配是由編譯器進行釋放,無需任何手工實現。
㈡ 什麼是C語言中的棧
棧是一種數據存儲的結構,其實跟數組,隊列的存儲方式是一樣的,主要是它有存儲的規則,就是先進後出,只在棧定操作。
也就是說數據存入一個棧,取出的是最後一個存入的數據,必須從最後一個開始取。
可參考網路和維基網路
㈢ c語言中的棧是指什麼啊
是一種數據結構.這種結構的存取原則相當於取放盤子的過程,放的時候將盤子一個一個堆起來放,取的時候先取原先最後放入的一個,然後依次類推.即後進先出的原則.
棧有順序(數組等)和鏈式(鏈表)兩種存儲結構,它的邏輯結構實質是線性表中的一種,只是這種線性表只允許在其中一端進行存取操作.更為詳細的解釋請參考數據結構一書!
㈣ c語言中棧的定義
保存數據之用,先壓棧最後出棧,不要與系統關鍵字同名就OK
㈤ C語言棧是什麼,棧在哪,需要定義嗎
棧是一種數據結構,後進先出,即最後進入棧的數據最先彈出。
c語言中沒有棧這種數據類型,需要自己編程構建。
㈥ C語言中的棧、堆是什麼
C語言中的堆和棧都是一種數據項按序排列的數據結構。
棧就像裝數據的桶或箱子
我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。
這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆像一棵倒過來的樹
而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。
通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書。
雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。
(6)棧c語言擴展閱讀:
關於堆和棧區別的比喻
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
參考資料來源:網路-堆棧
㈦ 棧的c語言實現基本操作
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#definestack_init_size20
#defineincreasesize10;
typedefintElemType;
typedefstructnode{
ElemType*base;
ElemType*top;
intsize;
}stack;
voidcreat(stack*s)
{
s->base=(ElemType*)malloc(sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->base=s->top;
s->size=stack_init_size;
}
voidpush(stack*s,ElemTypee)
{
if(s->top-s->base>=s->size)
{
s->base=(ElemType*)realloc(s->base,(s->size+increasesize)*sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top=s->base+s->size;
s->size+=increasesize;
}
*(s->top)=e;
s->top++;
}
voidpop(stack*s,ElemType*e)
{
if(s->top==s->base)
{
return;
}
*e=*--(s->top);
}
intstacklen(stacks)
{
return(s.top-s.base);
}
intmain()
{
stacks;
intn;
ElemTypee1,e2,d;
inti=1,j=1;
push(&s,i);
push(&s,j);
scanf("%d",&n);
while(n--)
{
pop(&s,&e1);
pop(&s,&e2);
d=e1+e2;
push(&s,e2);
push(&s,d);
}
pop(&s,&d);
printf("%d",d);
return0;
}
㈧ C語言!!!棧
#defineSTACK_SIZE100//定義棧容量為100
intcontents[STACK_SIZE];//定義數組contents用作棧
inttop=0;//定義並初始化棧頂指針為0
//函數作用:清空棧
voidmake_empty(void)
{
top=0;//直接將棧頂指針置0
}
//函數作用:判斷棧是否為空
boolis_empty(void)
{
returntop==0;//返回top是否等於0
}
//函數作用:判斷棧是否已滿
boolis_full(void)
{
returntop==STACK_SIZE;//返回top是否等於STACK_SIZE
}
//函數作用:向棧中壓入一個元素i
voidpush(inti)
{
if(is_full())//如果棧已滿
stack_overflow();//執行棧上溢操作
else//否則可以入棧
contents[top++]=i;//向棧中壓入i,然後將棧頂指針+1
}
//函數作用:彈出棧頂元素並返回
intpop(void)
{
if(is_empty())//如果棧為空
stack_underflow();//執行棧下溢操作
else//否則可以出棧
returncontents[--top];//返回棧頂元素,然後將棧頂指針-1
}
㈨ C語言計算棧
#include <stdio.h>
double readnumber(char a[],int *i)//將數字字元轉變成相應的數
{
double x=0.0;
int k=0;
while(a[*i]>='0'&&a[*i]<='9')
{
x=x*10+a[*i]-'0';
(*i)++;
}
if(a[*i]=='.')
{
(*i)++;
while(a[*i]>='0'&&a[*i]<='9')
{
x=x*10+a[*i]-'0';
(*i)++;
k++;
}
}
while(k!=0)
{
x=x/10.0;
k=k-1;
}
return x;
}
double yunsuan(char a[])//求一個後綴表達式的值
{
double obst[100],b,c;//操作數棧
int top=0,i=0;
while(a[i]!='\0')
{
if(a[i]>='0'&&a[i]<='9')
obst[top++]=readnumber(a,&i);
else if(a[i]==' ') i++;
else if(a[i]=='+')
{
b=obst[--top];
c=obst[--top];
obst[top++]=b+c;
i++;
}
else if(a[i]=='-')
{
b=obst[--top];
c=obst[--top];
obst[top++]=c-b;
i++;
}
else if(a[i]=='*')
{
b=obst[--top];
c=obst[--top];
obst[top++]=b*c;
i++;
}
else if(a[i]=='/')
{
b=obst[--top];
c=obst[--top];
obst[top++]=c/b;
i++;
}
}
return obst[0];
}
int pd(char op)//判斷一個字元是不是運算符
{
switch(op)
{
case '+':
case '-':
case '*':
case '/':return 1;
default :return 0;
}
}
int priority(char op)//求運算符的優先順序
{
switch(op)
{
case '\0':return -1;
case '(':return 0;
case '+':
case '-':return 1;
case '*':
case '/':return 2;
default:return -1;
}
}
void charge(char a[],char b[])//將中綴表達式轉換等價的後綴表達式
{
int i=0,j=0;
char opst[100];
int top,t;
top=0;
opst[top]='\0';
top++;
while(a[i]!='\0')
{
if(a[i]>='0'&&a[i]<='9'||a[i]=='.')
b[j++]=a[i];//遇到數字和小數點直接寫入後綴表達式
else if(a[i]=='(')//遇到左括弧進入操作符棧
{
opst[top]=a[i];
top++;
}
else if(a[i]==')')
{
t=top-1;
while(opst[t]!='(')
{//'('之前出棧
b[j++]=opst[--top];
t=top-1;
}
top--;
}
else if(pd(a[i]))//'+','-','*','/'
{
b[j++]=' ';//用空格分開兩個操作數
while(priority(opst[top-1])>=priority(a[i]))
b[j++]=opst[--top];
opst[top]=a[i];
top++;
}
i++;
}
while(top) b[j++]=opst[--top];
}
int main()
{
char a[100],b[100];
double jieguo;
printf("\n\t請輸入算術表達式:");
scanf("%s",a);
charge(a,b);
jieguo=yunsuan(b);
printf("\t表達式運算的結果為:%lf",jieguo);
return 0;
}
㈩ 棧的基本操作的C語言程序
#include <stdio.h>
#include <stdlib.h>
#define MAX 1024 ///棧使用數組模擬,MAX是最大元素個數
typedef int DataType; ///數據域使用整形
typedef struct _stack
{
DataType data[MAX]; ///存放數據
int top; ///棧頂指針
}stack;
///初始化
int initStack(stack (*s))
{
return emptyStack(s);
}
///數據壓棧,成功返回1,失敗返回0
int push(stack (*s), DataType d)
{
if ((*s).top >= MAX - 1) //棧已滿
{
printf("棧已滿,不能壓棧\n");
return 0;
}
//數據壓棧
(*s).top++;
(*s).data[(*s).top] = d;
return 1;
}
///數據出棧,成功返回1,d指向的區域存儲彈出的數據,失敗返回0
int pop(stack (*s), DataType *d)
{
if ((*s).top <= -1)
{
printf("棧為空,不能出棧\n");
return 0;
}
//出棧
*d = (*s).data[(*s).top];
(*s).top--;
return 1;
}
///清空棧
int emptyStack(stack (*s))
{
(*s).top = -1;
return 1;
}
int main(int argc, char** argv)
{
stack s;
int i, d;
initStack(&s);
//壓棧
for (i = 0; i < 1025; i++)
{
push(&s, i);
}
//清空
emptyStack(&s);
for (i = 0; i < 10; i++)
{
push(&s, i);
}
//出棧
for (i = 0; i < 11; i++)
{
pop(&s, &d);
printf("%d\n", d);
}
return 0;
}