❶ 求用c語言編寫一個程序實現順序棧初始化,出棧,入棧,判棧空,判棧滿,急需,謝謝
#define STACK_SIZE 100
#define PUSH_POP_SUCCESS 1
#define PUSH_POP_ERROR 0
struct _stackbuf {
int _collection[STACK_SIZE];
int _top;
};
typedef struct _stackbuf S_STACK;
typedef unsigned int u_int_f;
// 入棧
u_int_f push(S_STACK *stack, int d){
if (stack->_top >= STACK_SIZE) return PUSH_POP_ERROR;
stack->_collection[stack->_top++] = d;
return PUSH_POP_SUCCESS;
}
// 出棧
u_int_f pop(S_STACK *stack, int *e){
if (!stack->_top) return PUSH_POP_ERROR;
*e=stack->_collection[--(stack->_top)];
return PUSH_POP_SUCCESS;
}
int main(){
S_STACK stack = { {0},0 };
push(&stack, 1);
push(&stack, 2);
push(&stack, 3);
int gv = 0;
pop(&stack, &gv);
printf("%d\n", gv);
system("PAUSE");
return 0;
}
❷ 用c語言編寫一個程序實現順序棧的初始化,出棧和入棧。急需,謝謝
#defineSTACK_SIZE100
#definePUSH_POP_SUCCESS1
#definePUSH_POP_ERROR0
struct_stackbuf{
int_collection[STACK_SIZE];
int_top;
};
typedefstruct_stackbufS_STACK;
typedefunsignedintu_int_f;
//入棧
u_int_fpush(S_STACK*stack,intd){
if(stack->_top>=STACK_SIZE)returnPUSH_POP_ERROR;
stack->_collection[stack->_top++]=d;
returnPUSH_POP_SUCCESS;
}
//出棧
u_int_fpop(S_STACK*stack,int*e){
if(!stack->_top)returnPUSH_POP_ERROR;
*e=stack->_collection[--(stack->_top)];
returnPUSH_POP_SUCCESS;
}
intmain(){
S_STACKstack={{0},0};
push(&stack,1);
push(&stack,2);
push(&stack,3);
intgv=0;
pop(&stack,&gv);
printf("%d ",gv);
system("PAUSE");
return0;
}
❸ 用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>
int IsEmpty(int p)/*判斷是否為空*/
{
if(p==0)
return 1;
else
return 0;
}
int Push(int p)/*入棧*/
{
p++;
return(p);
}
int Pop(int p)/*出棧*/
{
p--;
return(p);
}
void create()
{
char expression[20];
int i=0,p=0;
printf("please scan your expression which length less than 20,scan # to stop:\n");
scanf("%s",expression);
while(expression[i]!='#')
{
if(expression[i]=='(')/*如果遇到'('入棧*/
p=Push(p);
if(expression[i]==')')/*如果遇到')'且棧不為空'('出棧*/
{
if(IsEmpty(p))
{
printf("ERROR!\n");
exit(0);
}
else
p=Pop(p);
}
i++;
}
if(IsEmpty(p))
printf("OK!\n");
else
printf("ERROR!\n");
}
void main()
{
int i=0;
while(i!=-1)/*按-1退出程序運行*/
{
create();
printf("go on scan any number excepet for -1:\n");
scanf("%d",&i);
}
}
❺ 建立順序存儲的棧,並對之進行入棧、出棧、取棧頂元素操作的c語言演算法
#include "process.h"
#include "stdio.h"
#include "assert.h"
const int stackIncreament=20; //棧溢出時擴展空間的增量
class SeqStack
{
private:
int top; //棧頂指針
int MAX; //棧的最大可容納個數
int *elements; //存放棧中元素的棧數組
void overflowProcess(); //棧的溢出處理
public:
SeqStack(int sz=50); //構造函數
~SeqStack() { delete[]elements; } //析構函數
bool pop1(int & x); //元素出棧
void push1(const int & x); //新元素進棧
bool IsEmpty1()const; //判斷棧空與否
bool IsFull1()const; //判斷棧滿與否
void output1(); //輸出元素進棧順序
void output(int x); //輸出x
};
SeqStack::SeqStack(int sz):top(-1),MAX(sz)
{
elements=new int[MAX]; //創建棧的數組空間
assert(elements!=NULL); //斷言:動態存儲分配成功與否
}
bool SeqStack::pop1(int & x) //棧頂元素出棧
{
if(IsEmpty1()==true) return false;//判棧空否,若棧空則函數返回
x=elements[top--]; //棧頂指針退1
return true; //退棧成功
}
void SeqStack::push1(const int & x) //新元素進棧
{
if(IsFull1()==true) overflowProcess(); //棧滿則溢出處理
elements[++top]=x; //棧頂指針先加1,再進棧
}
bool SeqStack::IsEmpty1() const //判斷棧空與否
{
return (top==-1)?true:false;
}
bool SeqStack::IsFull1()const //判斷棧滿與否
{
return (top==MAX-1)?true:false;
}
void SeqStack::overflowProcess() //棧的溢出處理
{
//私有函數,擴充棧的存儲空間。
int *Array=new int[MAX+stackIncreament]; //和課本不一樣 ??????????
if(Array==NULL)
{
printf("存貯分配失敗 ! \n");
exit(1);
}
for(int i=0;i<=top;i++) Array[i]=elements[i];
MAX=MAX+stackIncreament;
delete []elements;
//elements=Array;
}
void SeqStack::output1() //元素入棧順序輸出
{
int n=0;
int t=top;
for(int i=0;i<top;i++)
{
printf(" %d",elements[i]);
n++;
if(n%10==0)
printf("\n");
}
}
void SeqStack::output(int x) //棧內元素輸出
{
printf(" %d",x);
}
//----------------------順序棧函數--------------------------//
void SeqStack1( SeqStack A)
{
int x=-1;
int X;
printf("請輸入要入棧A的元素值,以0結束:\n");
while(x!=0){ //新元素進棧
scanf("%d",&x);
A.push1(x);
}
printf("\n元素進棧順序是 :");
A.output1();
printf("\n\n");
A.pop1(X); //元素出棧
if(!A.pop1(X))
printf("元素出棧失敗 !\n");
else
{
printf("\n棧頂元素是: ");
A.output(X);
printf("\n");
printf("\n元素出棧的結果是 : ");
A.output(X);
while(A.pop1(X))
A.output(X);
}
}
void main()
{
printf("----------順序棧的調試----------\n");
printf("\n \n");
SeqStack A;
SeqStack1(A);
printf("\n \n");
}
❻ C語言編程:順序棧的入棧與退棧及讀頂元素
舉一個例子說明
《停車場管理》
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include
"stdio.h"
#include
"malloc.h"
#define
max_stop
5
//
停車場容量//
#define
PRICE
8
//停車單價
//
typedef
struct//汽車//
{
char
*license[20];
//汽車//
}car;
typedef
struct
//停車場//
{
car
stop[max_stop];
//停車場//
int
top;
}parking;
void
come(car
p,parking
*tcc)
{
if(tcc->top>=max_stop-1){printf("已滿!!");}
else
{
printf("
輸入到來汽車的車牌號碼
:
");
scanf("%s",p.license);
printf("\n");
tcc->top++;
tcc->stop[tcc->top]=p;//如果停車場沒有滿就入場//
}
}
void
display(car
p,parking
*tcc)
{
int
n=0;
if(tcc->top==-1)printf("
停車場內無汽車!\n");
//指針在-1處
停車場內無車//
else{
//
有車
//
printf("●停車場內的車為:\n");
while(n<=tcc->top)
{
printf("第
%d
輛
%s\n",n+1,tcc->stop[n].license);
n++;
}
}
}
void
leave(car
p,parking
*tcc)
{
car
leavecar;
int
num,money,time;
printf("
輸入將要離開的汽車車位號碼:");
scanf("%d",&num);
num--;
if(num>tcc->top||num<0)printf("
你的輸入有誤
請檢查預備出停車場的車輛號碼\n");
else
{
printf("
輸入此車停留的時間
:
");
scanf("%d",&time);
if(time<=0)printf("
你的輸入有誤
請檢查停車時間\n");
else
{
leavecar=tcc->stop[num];
while(numtop)
{
tcc->stop[num]=tcc->stop[num+1];
num++;
}
tcc->top--;
}
}
if((num<=tcc->top)
&&
(num>=0))
{
money=time*PRICE;
printf("●
%s
已經離開停車場
停留%d小時
收費%d元",leavecar.license,time,money);
}
}
void
welcome()
//歡迎界面//
{
printf("
●歡迎適用本程序●\n");
printf("
本程序為停車場的模擬管理程序,有車到來時請按
C
鍵\n");
printf("
然後根據屏幕提示進行相關操作,有車要走時請按
L
鍵\n");
printf("
然後根據屏幕提示進行相關操作,若需要幫助請按
H
鍵\n");
printf("
然後根據屏幕提示進行相關操作,要退出程序請按
Q
鍵\n");
}
void
main()
{
char
key;
car
p;
parking
*tcc;
tcc=(parking
*)malloc(sizeof(parking));
tcc->top=-1;
while(1)
{
flushall();
printf("
請輸入您的操作
:
");
scan
❼ C語言編程實現順序棧的初始化,入棧,出棧,取棧頂元素,顯示操作
#define STACKSIZE 100
int mstack[STACKSIZE],top,bottom;
void mInitStack() { top=bottom=0; }
void mPush(int x) { if ( top-bottom<=STACKSIZE ) { mstack[top]=x; top++; } }
int mPop() { int r=0; if ( top>bottom ) { r=mstack[top]; top--; } return r; }
void mShowStack() { int i; printf("["); for ( i=bottom;i<top;i++ ) printf("%d ",mstack[i]); printf("]
"); }
void main()
{
int i,n,x,loop=1,s;
char buffer[80];
mInitStack();
scanf("%d",&n); for ( i=0;i<n;i++ ) { scanf("%d",&x); mPush(x); }
mShowStack();
while ( loop )
{ buffer[1]=0; gets(buffer); s=1;
switch ( buffer[1] )
{ case 'O':
case 'o': x=mPop(); break;
case 'U':
case 'u': x=atoi(buffer+5); mPush(x); break;
case 'n':
case 'N': loop=0; break;
default: s=0; break;
}
mShowStack();
}
mShowStack();
}
❽ 求順序棧的c語言
這是編譯錯誤。。。。。。 醉了
❾ C語言 入棧順序為什麼函數入棧順序從右往左
C語言函數參數入棧順序從右到左是為了方便可變參數函數。
一、在函數調用時,函數參數的傳遞,在C語言中是通過棧數據結構實現的。
在調用函數時,先根據調用函數使用的參數,自右向左依次壓入棧中,然後調用函數,在函數開始執行時,將參數再依次彈棧。根據棧數據結構先進後出的特點,在函數中彈棧的順序就是從左向右的。
二、對於參數固定的函數,無論是從左向右還是從右向左,都沒什麼區別,最終都是所有參數全部傳遞。
三、對於可變參數,比如printf,會在第一個參數格式字元串中,指明後續有幾個參數,各自是什麼類型的。於是在函數中,參數格式字元串必須第一個彈棧,否則無法獲取參數類型,也就無法獲知後續參數占幾個位元組,導致無法正確獲知參數。
四、理論上來說,如果從左向右壓棧,可變參數標記格式字元串的參數放在最後,那麼也是可以的。 不過最早設計C語言的人採用了這種方式,後續也就延續下來了。