#include<iostream>
using namespace std;
#include"SeqStack19D王憶蓮.h"
template<typename DataType> //建構式,堆疊的初始化
SeqStack<DataType>::SeqStack()
{
int top=-1;
} template<typename DataType>
SeqStack<DataType>::~SeqStack(){} template<typename DataType> //入堆疊操作
void SeqStack<DataType>::Push(DataType x)
{
if(top==StackSize-1) throw"上溢";
data[++top]=x;
}
template<typename DataType>
DataType SeqStack<DataType>::Pop()
{
DataType x;
if(top==-1) throw"下溢";
x=data[top--];
return x;
}
template<typename DataType> //取堆疊頂元素
DataType SeqStack<DataType>::GetTop()
{
if(top!=-1)
return data[top];
}
template<typename DataType>
void SeqStack<DataType>::Change()
{
SeqStack<char> C;
char ch;
char outch;
cout<<"請輸入中綴運算式,并以#結尾"<<endl;
cin>>ch;
while(ch!='#')
{ while(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') //遇到數字和字符直接輸出 { cout<<ch; cin>>ch; }
//遇到字符+ - if(ch=='+'||ch=='-') //優先級最低的+、- { if(top==-1){ C.Push(ch); //堆疊空時直接入堆疊 } else{//堆疊非空 do{ outch=C.Pop(); if(outch=='(') { C.Push(outch); }else{cout<<outch;} //否則直接輸出堆疊頂元素,因為+、-優先級最低 }while((C.top!=-1)&&outch!='('); C.Push(ch); //將+、-入堆疊 } }
//遇到) else if(ch==')'){ //遇到),依次輸出堆疊中元素直到遇到(,并且把(元素洗掉 outch=C.Pop(); while(outch!='('){ cout<<outch; outch=C.Pop(); } } //遇到*、/、( else if(ch=='*'||ch=='/'||ch=='('){ C.Push(ch); //優先級高直接入堆疊 } //遍歷操作遇到# else if(ch=='#'){ break;
} else{ cout<<endl<<"輸入格式錯誤,沒有以#結尾"<<endl; return;
} cin>>ch; }
//最后,若堆疊不是空的,依次輸出堆疊中元素
while(C.top!=-1){ outch=C.Pop(); cout<<outch;
}
}輸出有錯誤,求大佬指點
uj5u.com熱心網友回復:
用std的stack把代碼修改了一下,LZ自己參考不同的地方吧using namespace std;
int main() {
stack<char> C; //這里改用std的stack,但不影響原來的整體思路
char ch;
cout<<"請輸入中綴運算式,并以#結尾"<<endl;
cin>>ch;
while(ch!='#') {
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //遇到數字和字符直接輸出
{ cout<<ch; cin>>ch; }
//遇到優先級最低的+、-
if(ch=='+'||ch=='-') { //堆疊空時直接入堆疊
while(!C.empty() && (C.top()!='(')) { //這里修改了
cout<<C.top();
C.pop();
}
C.push(ch);
}
//遇到),依次輸出堆疊中元素直到遇到(,并且把(元素洗掉
else if(ch==')') {
while(C.top()!='('){
cout<<C.top();
C.pop();
}
C.pop(); //這里也修改了
}
else if (ch=='(') {
C.push(ch);
}
//遇到*、/、(優先級高直接入堆疊
else if(ch=='*'||ch=='/'){ //這里單獨把括號分開因為乘除雖同級,但要考慮先后順序
// 比如a/b*c的后綴 ab/c* 和 abc*/ 是不等效的
///* 把這個注釋放開看看效果就知道了
while(!C.empty() && (C.top()!='(') && (C.top()!='+') && (C.top()!='-')) { //這里也修改了(加了同級的優先順序)
cout<<C.top();;
C.pop();
}
//*/
C.push(ch);
}
//遍歷操作遇到#
else if(ch=='#'){ break;}
else{ cout<<endl<<"輸入格式錯誤,沒有以#結尾"<<endl;}
cin>>ch;
}
//最后,若堆疊不是空的,依次輸出堆疊中元素
while(!C.empty()){ cout<<C.top(); C.pop();}
return 0;
}
uj5u.com熱心網友回復:
可以把你的判空函式給一下嗎還有建構式 入堆疊出堆疊那些
uj5u.com熱心網友回復:
可以把你建構式 入堆疊出堆疊判空那些給一下嗎uj5u.com熱心網友回復:
可以一個完整的有嗎uj5u.com熱心網友回復:
可以一個完整的有嗎 可以把你建構式 入堆疊出堆疊判空那些給一下嗎 用std的stack把代碼修改了一下,LZ自己參考不同的地方吧
using namespace std;
int main() {
stack<char> C; //這里改用std的stack,但不影響原來的整體思路
char ch;
cout<<"請輸入中綴運算式,并以#結尾"<<endl;
cin>>ch;
while(ch!='#') {
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //遇到數字和字符直接輸出
{ cout<<ch; cin>>ch; }
//遇到優先級最低的+、-
if(ch=='+'||ch=='-') { //堆疊空時直接入堆疊
while(!C.empty() && (C.top()!='(')) { //這里修改了
cout<<C.top();
C.pop();
}
C.push(ch);
}
//遇到),依次輸出堆疊中元素直到遇到(,并且把(元素洗掉
else if(ch==')') {
while(C.top()!='('){
cout<<C.top();
C.pop();
}
C.pop(); //這里也修改了
}
else if (ch=='(') {
C.push(ch);
}
//遇到*、/、(優先級高直接入堆疊
else if(ch=='*'||ch=='/'){ //這里單獨把括號分開因為乘除雖同級,但要考慮先后順序
// 比如a/b*c的后綴 ab/c* 和 abc*/ 是不等效的
///* 把這個注釋放開看看效果就知道了
while(!C.empty() && (C.top()!='(') && (C.top()!='+') && (C.top()!='-')) { //這里也修改了(加了同級的優先順序)
cout<<C.top();;
C.pop();
}
//*/
C.push(ch);
}
//遍歷操作遇到#
else if(ch=='#'){ break;}
else{ cout<<endl<<"輸入格式錯誤,沒有以#結尾"<<endl;}
cin>>ch;
}
//最后,若堆疊不是空的,依次輸出堆疊中元素
while(!C.empty()){ cout<<C.top(); C.pop();}
return 0;
}
uj5u.com熱心網友回復:
這個就是完整的代碼,使用std提供的堆疊,不用自己實作堆疊 可以一個完整的有嗎 可以把你建構式 入堆疊出堆疊判空那些給一下嗎 用std的stack把代碼修改了一下,LZ自己參考不同的地方吧
using namespace std;
int main() {
stack<char> C; //這里改用std的stack,但不影響原來的整體思路
char ch;
cout<<"請輸入中綴運算式,并以#結尾"<<endl;
cin>>ch;
while(ch!='#') {
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //遇到數字和字符直接輸出
{ cout<<ch; cin>>ch; }
//遇到優先級最低的+、-
if(ch=='+'||ch=='-') { //堆疊空時直接入堆疊
while(!C.empty() && (C.top()!='(')) { //這里修改了
cout<<C.top();
C.pop();
}
C.push(ch);
}
//遇到),依次輸出堆疊中元素直到遇到(,并且把(元素洗掉
else if(ch==')') {
while(C.top()!='('){
cout<<C.top();
C.pop();
}
C.pop(); //這里也修改了
}
else if (ch=='(') {
C.push(ch);
}
//遇到*、/、(優先級高直接入堆疊
else if(ch=='*'||ch=='/'){ //這里單獨把括號分開因為乘除雖同級,但要考慮先后順序
// 比如a/b*c的后綴 ab/c* 和 abc*/ 是不等效的
///* 把這個注釋放開看看效果就知道了
while(!C.empty() && (C.top()!='(') && (C.top()!='+') && (C.top()!='-')) { //這里也修改了(加了同級的優先順序)
cout<<C.top();;
C.pop();
}
//*/
C.push(ch);
}
//遍歷操作遇到#
else if(ch=='#'){ break;}
else{ cout<<endl<<"輸入格式錯誤,沒有以#結尾"<<endl;}
cin>>ch;
}
//最后,若堆疊不是空的,依次輸出堆疊中元素
while(!C.empty()){ cout<<C.top(); C.pop();}
return 0;
}
uj5u.com熱心網友回復:
這個就是完整的代碼,使用std提供的堆疊,不用自己實作堆疊 可以一個完整的有嗎 可以把你建構式 入堆疊出堆疊判空那些給一下嗎 用std的stack把代碼修改了一下,LZ自己參考不同的地方吧
using namespace std;
int main() {
stack<char> C; //這里改用std的stack,但不影響原來的整體思路
char ch;
cout<<"請輸入中綴運算式,并以#結尾"<<endl;
cin>>ch;
while(ch!='#') {
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //遇到數字和字符直接輸出
{ cout<<ch; cin>>ch; }
//遇到優先級最低的+、-
if(ch=='+'||ch=='-') { //堆疊空時直接入堆疊
while(!C.empty() && (C.top()!='(')) { //這里修改了
cout<<C.top();
C.pop();
}
C.push(ch);
}
//遇到),依次輸出堆疊中元素直到遇到(,并且把(元素洗掉
else if(ch==')') {
while(C.top()!='('){
cout<<C.top();
C.pop();
}
C.pop(); //這里也修改了
}
else if (ch=='(') {
C.push(ch);
}
//遇到*、/、(優先級高直接入堆疊
else if(ch=='*'||ch=='/'){ //這里單獨把括號分開因為乘除雖同級,但要考慮先后順序
// 比如a/b*c的后綴 ab/c* 和 abc*/ 是不等效的
///* 把這個注釋放開看看效果就知道了
while(!C.empty() && (C.top()!='(') && (C.top()!='+') && (C.top()!='-')) { //這里也修改了(加了同級的優先順序)
cout<<C.top();;
C.pop();
}
//*/
C.push(ch);
}
//遍歷操作遇到#
else if(ch=='#'){ break;}
else{ cout<<endl<<"輸入格式錯誤,沒有以#結尾"<<endl;}
cin>>ch;
}
//最后,若堆疊不是空的,依次輸出堆疊中元素
while(!C.empty()){ cout<<C.top(); C.pop();}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/185073.html
標籤:C++ 語言
