您好,登錄后才能下訂單哦!
包括三個文件:stack.h,stack.cpp,main.cpp
stack.h
#include "stdio.h" #include <stdlib.h> #include <malloc.h> #include <string.h> #define Status int #define SElemType int #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW 0 #define ERROR 0 #define OK 1 // typedef struct { SElemType *base; //指向棧尾 SElemType *top; //指向棧頂 int stacksize; //記錄棧元素個數(shù) }SqStack; // // //棧的基本操作 // //初始化棧 Status InitStack(SqStack &S); //返回1,表示成功;返回0表示不成功 //判棧滿 Status IsFull(SqStack &S); //判???Status IsEmpty(SqStack &S); //如空,返回1;非空返回0 //入棧 Status Push(SqStack &S,SElemType e); //出棧 Status Pop(SqStack &S,SElemType &e); //顯示棧元素 Status StackTraverse(SqStack &S); //訪問棧頂 Status GetTop(SqStack &S,SElemType &e); //求棧長度 int StackLength(SqStack &S); //清空棧 Status ClearStack(SqStack &S); //銷毀棧 Status DestroyStack(SqStack &S);
stack.cpp
#include "stack.h" #include "stdio.h" #include <stdlib.h> #include <malloc.h> #include <iostream> using namespace std; //棧的基本操作 // ////初始化棧 Status InitStack(SqStack &S) { //構(gòu)造一個空棧 S.base =(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) return(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } //判棧滿 Status IsFull(SqStack &S) { //若滿返回1,否則返回0 if((S.top-S.base)>= S.stacksize) //若棧滿 { //cout<<"棧滿"<<endl; return 1;} else return 0; } //判空 Status IsEmpty(SqStack &S) { //若棧空返回1,否則返回0 if(S.top==S.base) { //cout<<"???<<endl; return 1; } else return 0; } //入棧 Status Push(SqStack &S,SElemType e) { //將e插入棧頂 //判滿,加空間 if( IsFull(S)==1) { S.base=(SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType)); if(S.base==NULL) return(OVERFLOW); S.top=S.base + S.stacksize; //top指針移動到新位置 S.stacksize=S.stacksize + STACKINCREMENT; //棧空間擴(kuò)容 } *S.top=e; //棧頂元素賦值 S.top++; //top指針上移 //入棧 return 0; } //出棧 Status Pop(SqStack &S,SElemType &e) { //彈出棧頂元素,并用e接收 //判空 if(IsEmpty(S)==1) return(ERROR); //彈出 S.top--; e=*S.top; //等價于e= *(--top) return OK; } //顯示棧中元素 Status StackTraverse(SqStack &S) { // cout<<"遍歷棧元素"<<endl; SElemType *p; p=S.base; while(p!=S.top) { cout<<*p<<" "; p++; } cout<<endl; cout<<"遍歷完畢!"<<endl; return 0; } //取棧頂元素 Status GetTop(SqStack &S,SElemType &e) { //若棧空返回ERROR,否則返回1 if(IsEmpty(S)==1) return ERROR; S.top--; e=*S.top; return OK; } //求長度 int StackLength(SqStack &S) { return S.top-S.base; } //清空棧 Status ClearStack(SqStack &S) { S.top=S.base; //cout<<"已清空棧"<<endl; return OK; } //銷毀棧 Status DestroyStack(SqStack &S) { free(S.base); S.top=NULL; S.base=NULL; S.stacksize=0; cout<<"已銷毀棧"<<endl; return OK; }
main.cpp
#include <iostream> #include "stack.h" using namespace std; int main() { /* SqStack sta; InitStack(sta); cout<<IsEmpty(sta)<<endl; Push(sta,'a'); Push(sta,'b'); Push(sta,'c'); Push(sta,'d'); cout<<"棧長度為:"<<StackLength(sta)<<endl; StackTraverse(sta); cout<<IsEmpty(sta)<<endl; SElemType e; Pop(sta,e); cout<<"棧長度為:"<<StackLength(sta)<<endl; cout<<"e="<<e<<endl; StackTraverse(sta); GetTop(sta,e); cout<<"e="<<e<<endl; cout<<"棧長度為:"<<StackLength(sta)<<endl; ClearStack(sta); cout<<"棧長度為:"<<StackLength(sta)<<endl; Push(sta,'a'); Push(sta,'b'); Push(sta,'c'); Push(sta,'d'); StackTraverse(sta); cout<<"棧長度為:"<<StackLength(sta)<<endl; DestroyStack(sta); //cout<<"棧長度為:"<<StackLength(sta)<<endl; */ /* //需求:將一個十進(jìn)制轉(zhuǎn)換為二進(jìn)制 void conversion(); conversion(); //cout<<"棧長度為:"<<StackLength(sta)<<endl; */ //需求:行編程程序 /* void LineEdit(); LineEdit(); */ //需求:后綴表達(dá)式求值 3 4 + 5 * 7 / char str[100]; fgets(str,100,stdin); //從標(biāo)準(zhǔn) 輸入獲取字符串 int res=0; int ReverseCal(char *); //函數(shù)聲明 res=ReverseCal(str); //函數(shù)調(diào)用 cout<<"res="<<res<<endl; system("pause"); return (0); } int Precede(char* c1,char* c2) { //大于返回1,小于返回-1,等于返回0 if(*c1=='*') { if(*c2=='+') return 1; if(*c2=='-') return 1; if(*c2=='*') return 0; if(*c2=='/') return 0; } if(*c1=='/') { if(*c2=='+') return 1; if(*c2=='-') return 1; if(*c2=='*') return 0; if(*c2=='/') return 0; } if(*c1=='+') { if(*c2=='+') return 0; if(*c2=='-') return 0; if(*c2=='*') return -1; if(*c2=='/') return -1; } if(*c1=='-') { if(*c2=='+') return 0; if(*c2=='-') return 0; if(*c2=='*') return -1; if(*c2=='/') return -1; } } char* InffixToSuffix(char *s) { //將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式 SqStack OPTR; //操作符棧 SqStack OPND; //操作數(shù)棧 InitStack(OPTR); InitStack(OPND); Push(OPTR,'#'); char *p=s; while(*p!='\0') { switch(*p) { //如果不是運(yùn)算符(是數(shù)字),入棧 //如果是運(yùn)算符,比較符合棧的操作符,再做 } p++; } return s; } int ReverseCal(char *s) { //逆波蘭式計算器 SqStack sta; InitStack(sta); //初始化話一個棧結(jié)構(gòu) int res; int a,b; char *p=s; p=strtok(s," "); //分解字符串 Push(sta,atoi(p)); //atoi()函數(shù)將字符串轉(zhuǎn)換為int while( (p=strtok(NULL," ")) !='\0') { switch(*p) { case '+': Pop(sta,b); Pop(sta,a); res = a+b; Push(sta,res); //將結(jié)果入棧 break; case '-': Pop(sta,b); Pop(sta,a); res = a-b; Push(sta,res); break; case '*': Pop(sta,b); Pop(sta,a); res = a*b; Push(sta,res); break; case '/': Pop(sta,b); Pop(sta,a); res = a/b; Push(sta,res); break; default: Push(sta,atoi(p)); //如果獲取數(shù)字直接入棧 } } return res; } /* void LineEdit() { //行編輯函數(shù) cout<<"請輸入字符:"<<endl; SqStack sta; InitStack(sta); //初始化話一個棧結(jié)構(gòu) char ch,e; ch=getchar(); //cout<<ch; while(ch!=EOF && ch!='\n') { switch(ch) { case '#': Pop(sta,e); //若輸入#,回退一格 break; case '@': ClearStack(sta); //若輸入@,回退一行 break; default: Push(sta,ch); break; } ch=getchar(); } StackTraverse(sta); //遍歷棧元素 DestroyStack(sta); //銷毀棧 }//行編輯函數(shù) */ void conversion() { //進(jìn)制轉(zhuǎn)換程序 int N; cout<<"請輸入一個正整數(shù):"<<endl; cin>>N; SqStack sta; InitStack(sta); while(N!=0) { Push(sta,N%2); //求余 N=N/2; //整除 } //StackTraverse(sta); cout<<"對應(yīng)的二進(jìn)制為:"<<endl; while(IsEmpty(sta)!=1) { SElemType e; Pop(sta,e); cout<<e<<" "; } cout<<endl; }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。